複数の読み取りコマンドを一度に実行できないのはなぜですか(一部の区切り構文なし)。

複数の読み取りコマンドを一度に実行できないのはなぜですか(一部の区切り構文なし)。

次の2つのコマンドを端末にコピーして貼り付けてみました。まっすぐ次に実行します。

read -s x
read -s y

現在の出力は空のプロンプトですが、目的の出力は最初のread実行と2番目のread実行のためのものです。

私は次の方法でこの問題を克服することができました。

read -s x &&
read -s y

しかし;

複数の読み取りコマンドを一度に実行できないのはなぜですか(一部の区切り構文なし)。

答え1

<newline>デフォルトでは、文字が貼り付けられたテキストの一部であるか、ユーザーが入力したかどうかは端末に違いはありません。貼り付けるとき

read -s x
read -s y

after は、端末がその行をシェルに送るようにします<newline>read -s xシェルはそれを解析し、それが完全なコマンド端末であることを見つけて実行します。readその後、標準入力で何かを待ち、端末はラインを供給し、read -s y最後に値を設定しますx

read -s xおおよそのと入力し、を押して、とEnter入力し、もう一度read -s y押すと機能しますEnter

追加のジョブが必要かどうかEnterx値が正確に何であるか、実際に印刷される内容、および後続の行で発生するジョブは、シェルと端末を設定するモードによって異なります。たとえば、Bash 5.0を使用し、クリップボードの両方の行が始まると仮定すると<newline>

                        # Pasting with Ctrl + Shift + v, Enter
$ read -s x
$                       # The prompt comes back after pressing Enter again
$ declare -p x y
"eclare -- x="read -s y
bash: declare: y: not found

(の出力はdeclare混乱しているようです。)行編集が有効になっている場合(デフォルト)、Bashは端末を\r(キャリッジリターン)を(改行)に変換しないように設定したためです。まず、端末に→変換を有効にするように指示するとき、端末は\nread\r\nすでに2番目の貼り付けた行の後にa(改行を押すか貼り付けるときに送信される文字\r)をバッファに入れると、その行が文字通り値に追加され、入力の終わりを知らせるためにキーを押す必要があります。EnterreadxEnter

貼り付けるとこんなことは起こりません

read -s x &&
read -s y

シェルがread -s x &&不完全な「AND」と解釈されるためリストコマンド全体が実行されるまで追加の入力を待ちます。

あなたの道できる一度に複数のコマンドを貼り付ける操作は、「括弧の貼り付け」を使用して行われます。このモードでは、貼り付けたテキストは手動で入力したものとして扱われず、単一の文字列としてバッファに挿入されます。

吹くそれを支えるバージョン4.4から。追加して有効にできます。

set enable-bracketed-paste on

Readline初期化ファイルに(デフォルトでは~/.inputrc)。

ジッシュそれを支えるバージョン5.1以降、ZLE(Zsh Line Editor)が有効になるとデフォルトで有効になります。

どのように機能するか、どのように有効にするかについては、以下を参照してください。

答え2

一種の区切り構文が必要です。そうでなければ、read1つのコマンドが終了し、次のコマンドがどこに始まるのかをどのように知ることができますか?

を使用すると、最初の項目がエラーを返さない場合&&にのみ2番目の項目が実行されます。read2番目の項目が常に実行されるようにするには、;次のように使用できます。

read -s x ; read -s y

ただし、1つを実行してread変数に保存xし、2番目の操作を実行してread変数に保存するかどうかはわかりません。y または1つを実行しread、同じ結果をxおよびに保存したい場合y。私の提案は電子です。

関連情報