問題は主に、入力が画面にエコーされる方法にあるようです。echo -n '
、Control-V、Control-J、と入力' | hexdump -C
すると、改行文字を入力したことが示されます。
Control-V を省略すると、出力は同じになりますが、bash は>
プロンプトを表示します。この場合、bash は入力された改行を認識し、引用符が終了していないため継続を求めています。Control-V を使用せず、Control-J の代わりに単に Return を押した場合、結果は Control-J を押した場合と同じになります。
引用符ではなく Control-V を使用すると、Control-J は改行として解釈されますが、bash はすぐには認識しません。したがって、echo foo
、Control-V、Control-Jと入力することは、次のecho bar
ように入力することと同じです。
echo foo
echo bar
echo
2 つのコマンドを発行して、次のように出力します。
foo
bar
2 つの行 (bash または readline で表示される) は、両方とも個別に履歴に含まれています。
このように考えてみてください。次のコマンドを発行した場合、何が起こると思いますか?
printf "echo foo\necho bar" | sh
printf
(入力内のエスケープ シーケンスを解釈することに注意してください。) bash は、入力ストリーム内の改行を 2 つの別々の行の間の区切り記号として解釈します。Control-V、Control-J と入力すると、同じものを認識し、同じように解釈します。