今朝、bashターミナルでこの奇妙な振る舞いをしました:
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
bash: [: missing «]»
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
true
- 最初のコマンドは、geditで編集されたスクリプトから貼り付けられました。
- 2番目は、ターミナルで直接入力されました。
掘り下げた後、30番目の文字(client.confと "]"の間のスペース)を削除し、スペースに置き換えるとコマンドが再び機能することがわかりました。
私の仮定は正しかった:未知の空白文字がコマンドに滑り込んだが、問題は:
- コマンドをデバッグできるように、端末でこれらの文字を表示するにはどうすればよいですか?さらに重要なこと:
- これが再び発生するのを防ぐにはどうすればよいですか?
ところで、Ubuntu 18.04 /フランス語を実行しています。コマンドを貼り付けるスクリプトはUSBドライブにあり、Windowsでも編集されている可能性があります。
非常に良い答えをありがとう。不良文字は、c2 a0の改行なしスペースUTF-8文字です。sedで特別な「M-BM-」キャラクターを削除する方法の質問には、そのキャラクターに関する興味深い事実があります。
奇妙なことは、スクリプトにこのキャラクターがないことです。だから、どこから来たのか分からない。
history 2|xxd
(history
コマンド自体が常にリストの最後であるため)、またはを入力しhistory|grep "CommandWithProblem"|xxd
ます。の代わりに他の16進表示プログラムを使用できますxxd
が、これは私の好みの形式にデフォルト設定されます。
set -x
。これにより、コマンドと分割方法が表示されます。「ここの悪いキャラクター」とは必ずしも言えませんが、bashがそのキャラクターで分裂していないことを示します。