次の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。
追加のジョブが必要かどうかEnter、x
値が正確に何であるか、実際に印刷される内容、および後続の行で発生するジョブは、シェルと端末を設定するモードによって異なります。たとえば、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
(キャリッジリターン)を(改行)に変換しないように設定したためです。まず、端末に→変換を有効にするように指示するとき、端末は\n
read
\r
\n
すでに2番目の貼り付けた行の後にa(改行を押すか貼り付けるときに送信される文字\r
)をバッファに入れると、その行が文字通り値に追加され、入力の終わりを知らせるためにキーを押す必要があります。Enterread
x
Enter
貼り付けるとこんなことは起こりません
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)が有効になるとデフォルトで有効になります。
どのように機能するか、どのように有効にするかについては、以下を参照してください。
- テキストを貼り付けた後、端末が自動的にコマンドを入力するのはなぜですか?
- Bashで複数行の貼り付けを防ぐ(Bashで括弧貼り付けを有効にする方法も説明しました)
答え2
一種の区切り構文が必要です。そうでなければ、read
1つのコマンドが終了し、次のコマンドがどこに始まるのかをどのように知ることができますか?
を使用すると、最初の項目がエラーを返さない場合&&
にのみ2番目の項目が実行されます。read
2番目の項目が常に実行されるようにするには、;
次のように使用できます。
read -s x ; read -s y
ただし、1つを実行してread
変数に保存x
し、2番目の操作を実行してread
変数に保存するかどうかはわかりません。y
または1つを実行しread
、同じ結果をx
およびに保存したい場合y
。私の提案は電子です。