質問: bashコマンド文字列の逐語的な文字を確認するにはどうすればよいですか? 私は今朝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で編集されたスクリプトからのpastedでした。 2番目は、ターミナルで直接入力されました。 掘り下げた後、30番目の文字(client.confと "]"の間のスペース)を削除し、それをスペースに置き換えると、コマンドが再び動作します。私の仮定は正しかった:不明な空白文字がコマンドに入力されましたが、質問は次のとおりです: コマンドをデバッグできるように、ターミナルでこれらの文字を表示するにはどうすればよいですか?そしてもっと重要なこと: これが再発しないようにするにはどうすればよいですか? ところで、私はubuntu 18.04 /フランス語を実行しています。コマンドを貼り付けるスクリプトはusbドライブにあり、windowsでも編集されている可能性があります。非常に良い答えをありがとう。悪い文字はc2 a0の改行なしスペースutf-8文字です。質問 sedで特殊な「m-bm-」文字を削除する方法 には、その文字について興味深い事実があります。奇妙なことに、スクリプトにはこのキャラクターが含まれていません。どこから来たのかわかりません。
回答: 1つのオプションは、16進ビューアまたはエディタで使用しようとしている文字を確認することです。 hexdumpは、端末に制限がある場合に適したオプションです。$ hexdump -cv <<"eof" > [ -f /etc/openvpn/client.conf ] && echo true > eof 00000000 5b 20 2d 66 20 2f 65 74 63 2f 6f 70 65 6e 76 70 |[ -f /etc/openvp| 00000010 6e 2f 63 6c 69 65 6e 74 2e 63 6f 6e 66 20 5d 20 |n/client.conf ] | 00000020 26 26 20 65 63 68 6f 20 74 72 75 65 0a |&& echo true.| 0000002d space、close-square-brace、spaceが正しいことがわかります-0x20、0x5d、0x20。これらの値はasciiコード、 16進数 で表示されます。範囲外の値0x20-0x7eは "ではありません印刷可能な文字 " asciiに関する限り、コマンドラインインターフェイスではうまく機能しない可能性があります。注:最初の "broken"行を上記のhexdumpの例で使用するためにコピーしたので、何かがnot-an-ascii-spaceをascii元のソースとレンダリングされた質問の間のスペースに置き換えました。これを繰り返すには、次の手順を実行します。 hexdump -cv <<"eof"と入力して押します enter 使用したいテキストを貼り付けます 1行にeofと入力し、 enter ターミナルとコマンドラインインターフェイスは、特殊文字を適切に処理しません-ご存じのとおりです。ドキュメントのフォーマットに細心の注意を払っていない場合は、microsoft word(およびその他)で「smart quotes」、em-dashesを使用すると問題が発生します。リストは続きます。 ..違いを見つけます:(上部は「smart quotes」、下部は「straight quotes」)$ hexdump -cv <<"eof" > “quoted string” > eof 00000000 e2 80 9c 71 75 6f 74 65 64 20 73 74 72 69 6e 67 |...quoted string| 00000010 e2 80 9d 0a |....| 00000014 ここで、開いた引用は単純なascii引用(")ではありませんが、unicode/ tf-8 シリーズ-0xe2です、0x80、0x9c、または u+201c -予想どおりに端末が処理しません。kiwyのcat -aの提案も機能します。$ cat -a <<"eof" > “quoted string” > eof m-bm-^@m-^\quoted stringm-bm-^@m-^]$ 注:echo "..." | hdを使用すると、bashが検査しようとしているストリング。これは、スクリプトのコンポーネントを検査しようとするときに特に懸念されます。たとえば、次のことを試してください。$ echo "${user}" attie $ echo "`whoami`" attie $ echo "$(whoami)" attie $ cat <<eof > ${user} > eof attie これらのメソッドは、コンポーネントを関連するテキストに置き換えています。これを回避するには、次のいずれかの方法を使用します。単一引用符(')と "quoted heredoc" ("eof")の使用に注意してください。$ echo '${user}' ${user} $ echo '`whoami`' `whoami` $ echo '$(whoami)' $(whoami) $ cat <<"eof" > ${user} > eof ${user}