問題は主に、入力が画面にエコーされる方法にあるようです。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
echo2 つのコマンドを発行して、次のように出力します。
foo
bar
2 つの行 (bash または readline で表示される) は、両方とも個別に履歴に含まれています。
このように考えてみてください。次のコマンドを発行した場合、何が起こると思いますか?
printf "echo foo\necho bar" | sh
printf(入力内のエスケープ シーケンスを解釈することに注意してください。) bash は、入力ストリーム内の改行を 2 つの別々の行の間の区切り記号として解釈します。Control-V、Control-J と入力すると、同じものを認識し、同じように解釈します。