cat> foo << "wordofchoice"という表現の論理は何ですか? [重複]

cat> foo <<

私は>と>>演算子を知っています。 >は前の内容を削除してファイルに何かを入れ、>>はファイルの内容の最後に何かを追加します。

ただ使ったとき

cat > foo

ctrl + zを押すまでfooに複数行を対話形式で書き込むことができ、その後は終了します。

今、私は追加演算子と私が選択した単語を逆順に追加すると

cat > foo << "wordofchoice"

最初の場合と同じことができますが、今回は>プロンプトが各行の先頭に表示され、Ctrl + Zを介して対話型入力を終了することはできませんが、代わりに「wordofchoice」と入力して(二重入力なしで引用符)対話型入力を終了します。

なぜこれが起こるのか、この表現のロジックは何なのか、<<演算子はここで何かを追加するのに何の意味もないようです。

ベストアンサー1

  • $PS2
    • ユーザーが\nインタラクティブシェルでコマンドラインを完了する前にewlineを入力するたびに、この変数の値はパラメータ拡張されて標準エラーに書き込まれる必要があります。デフォルト値はです>

>これが - のデフォルトであるため、改行$PS2文字を含むコマンド文字列を適切に区別できない場合にシェルが印刷するプロンプト文字列です。

引用符付き文字列を閉じていないため、コマンド文字列を区別できません。

  • さまざまな引用メカニズムには、エスケープ文字、一重引用符、二重引用符が含まれます。ここにある文書は代替引用形式を表します。ここのドキュメント

シェルパーサートークン化1行ずつ読むときに入力してください。 ewlineを送信しました\n。これは、端末がこれまでにコマンドのコピーを送信しましたが、少なくとも1つのオープン引用符付き文字列(つまり、不完全なコマンド1つ)を検出したことを意味します。したがって、メッセージが表示されます。残りの作業を行います。

  • 現在の文字が\バックスラッシュ、'一重引用符、または"二重引用符であり、引用符がない場合は、引用符付きテキストが終わるまで後続の文字の引用符に影響します。引用規則は次のとおりです。引用する。トークン認識中に実際に置き換えを行わないでください。結果トークンには入力に現れる文字を正確に含める必要があります。\n(ewline>登録を除く)\'"、埋め込みまたは囲む引用符または引用符と引用符の末尾の間の代替演算子を含む変更なし。トークンは、引用符付きフィールドの末尾に区切ってはいけません。

Here-documentは、次の理由で特別な引用形式です。リダイレクト- シェルは開始トークンと<<heredoc_delimiter_string\n期待される終了トークンで区切られた入力をリダイレクトします。\nheredoc_delimiter_string\ncommand <<start_here_document

  • \nここの文書は、次の行から始まり、次の行のみを含む行が出るまで続く単語として扱われるべきです。<<delimiterそして\neline、いいえスペース間の文字。その後、次のここで文書が開始されます(存在する場合)。形式は次のとおりです。

    [n]<<word here-document delimiter

2番目のシェルトークンを意味する他のものをシェルのパーサに送信しますが、閉じるトークンの前に改行文字を渡す場合、シェルは同様に機能します。たとえば、$PS2ewline やすでに述べた他の引用符の前にfor入力せずにループを開始すると、これが印刷されます。done\n

\nコマンドにewlineを配置するもう1つの方法は、端末を使用してそれを引用することです。通常、次の入力文字に逐語的な引用を使用できますCTRL+V。そうCTRL+VすればCTRL+J (または\nエライン)通常、端末は入力内容のコピーをすぐにシェルに送信しなくても、コマンド文字列にリテラルewlineを入力できます\n。なぜなら、一般的に端末は一行ずつ送りますが、CTRL+V 引用するシェルは改行文字も許可しないため、追加の入力を要求するメッセージは表示されません。

ただし、これは端末で引用された改行文字がシェルでも正しく引用されているという意味ではありません。これを行うには、該当する場合はシェル引用符を使用する必要があります。ただし、少なくともコマンド文字列を読み込むまで読み取ることはできません。提出する準備ができました。

おすすめ記事