UTF-8をターミナル(zsh)に貼り付けると、奇妙なことが起こります

-1
2022.03.06

ターミナルへのテキストの貼り付けが直接入力する場合とは異なる動作をする環境設定はありますか?

これをバグとして報告しましたが、環境設定があるかもしれません。最初の失敗の後、コマンドをスクリプトに入れてデモとして送信しましたが、スクリプトを実行すると機能しました。

コマンドは

echo "ΕΡΤΥΙΟΚΗΑΖΧΒΝΜ" | tr [:upper:] [:lower:]

文字列は、キーボードをギリシャ語に設定して入力したギリシャ文字です。キーと指を使用しても、キーボードビューアとマウスを使用しても、動作は同じです。

ロケールはen_US.UTF-8で、テキストエディットは常にUTF-8を使用するように設定されています。コマンドをテキストエディットに入れ、クリップボードにコピーして、ターミナルに貼り付けました(stdinにはギリシャ語の文字列が含まれています)。結果:

 zsh: no matches found: [:upper:]

クラスを入れ替えると、

 zsh: no matches found: [:lower:]

テキストエディットからファイルを保存し、 chmod 700を指定して実行すると、エラーメッセージは表示されず、正常に実行されます。

コマンドを変更してギリシャ語をラテン語に変換すると

echo "ΕΡΤΥΙΟΚΗΑΖΧΒΝΜ" | tr "ΕΡΤΥΙΟΚΗΑΖΧΒΝΜ" "EPTYIOKHAZXBNM"

(クラスを使用する代わりに)、貼り付けまたはスクリプトで機能します。

echo "" | od -xcと入力し、引用符の間にギリシャ語を貼り付けると、文字がASCIIではないことがわかります。したがって、クリップボードからの貼り付けは、文字の変更以外のことをしている必要があります。

ノート:

(1)trコマンドは貼り付けられた場合にのみ失敗し、 も=も含まれていないため、これらをエスケープすることは解決策ではありません。これはzshの複製ではありません。一致するものが見つかりません。

(2)zshが[:xxx:]をbashとは異なる方法で処理する可能性がありますが、ここにあるのは、貼り付けられたテキストを入力されたテキストとは異なる方法で処理するzsh / Terminalです。

回答
2
2022.03.07

いいえ、 zshシェルにエスケープして貼り付けないと問題が発生する可能性のあるすべての文字をペーストボードから取り除くための環境的なクイックフィックスはありません。

文字セットに注意し、スクリプトでshellcheckを実行して修正し、貼り付けるときに注意する必要があります。

bash Experienceの誰かに普通に見えるあらゆる種類のことは、 zshであなたをつまずかせる可能性があり、またそうなるでしょう-bashに戻すことは、あなたの場合の迅速な解決策かもしれません。