问题似乎主要在于输入如何回显到屏幕上。如果我输入echo -n '
, Control-V, Control-J, ' | hexdump -C
,则表明我输入了换行符。
如果我省略了 Control-V,则输出是相同的,尽管 bash 会显示>
提示。在这种情况下,bash 在输入时看到了换行符,并提示继续,因为引用未终止。如果我不使用 Control-V 并且只按 Return 而不是 Control-J,则结果与仅按 Control-J 相同。
使用 Control-V 而不是引号,Control-J 被解释为换行符,但 bash 不会立即看到它。因此,键入echo foo
、Control-V、Control-Jecho bar
等价于键入:
echo foo
echo bar
它发出两个echo
命令并打印:
foo
bar
这两行(如 bash 或 readline 所见)都分别在历史记录中。
这样想,如果你发出以下命令,你期望会发生什么?
printf "echo foo\necho bar" | sh
(请注意,printf
它会在其输入中解释转义序列。)Bash 会将其输入流中的换行符解释为两个单独行之间的分隔符。好吧,当您键入 Control-V、Control-J 时,它会看到相同的内容并以相同的方式对其进行解释。