为什么不能一次执行两个或多个读取命令(没有一些分离语法)?

0 read interpreter

我尝试将以下两个命令直接复制粘贴到终端中,然后执行它们:

read -s x
read -s y
Run Code Online (Sandbox Code Playgroud)

当前输出是空提示,但期望输出是第一次read执行,然后是第二次read执行。

我可以通过以下方式克服这个问题:

read -s x &&
read -s y
Run Code Online (Sandbox Code Playgroud)

但;

为什么不能一次执行两个或多个读取命令(没有一些分离语法)?

fra*_*san 5

默认情况下,<newline>字符是某些粘贴文本的一部分还是由用户键入对终端没有任何影响。当你粘贴

read -s x
read -s y
Run Code Online (Sandbox Code Playgroud)

<newline>之后read -s x使你的终端发送行到shell。shell 解析它,发现它是一个完整的命令 end 从而执行它:read然后等待标准输入上的内容,终端用 行 馈送它,该行read -s y最终设置为 的值x

它的工作方式大致就像您输入read -s x、按下Enter、输入read -s yEnter再次按下一样。

是否需要Enter您额外添加,具体值x变成什么,实际打印出来的内容以及后续行会发生什么取决于您的 shell 和它设置终端的模式。例如,使用 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
Run Code Online (Sandbox Code Playgroud)

(declare的输出看起来很混乱,因为 Bash 将终端配置为在行编辑处于活动状态(默认)时不将\r(回车)转换为\n(换行);当第一个read指示终端启用\r?\n转换时,终端已经放置了一个\rEnter按下时发送的字符或粘贴换行符时发送的字符)在第二条粘贴的行之后进入缓冲区,导致read将其逐字添加到 的值x并要求您按下Enter以表示输入结束)。

如果您粘贴,则不会发生这种情况

read -s x &&
read -s y
Run Code Online (Sandbox Code Playgroud)

因为 shell 解析read -s x &&为不完整的“AND”列表并等待更多输入,直到它可以运行完整的命令。

可以一次粘贴多个命令的方法是使用“带括号的粘贴”,这是一种终端模式,其中粘贴的文本作为单个字符串插入缓冲区,而不是被视为手动输入。

Bash从 4.4 版开始支持它。您可以通过添加启用它

set enable-bracketed-paste on
Run Code Online (Sandbox Code Playgroud)

到 Readline 初始化文件(默认为~/.inputrc)。

Zsh从 5.1 版开始支持它,并且在 ZLE(Zsh 行编辑器)处于活动状态时默认启用它。

有关它的工作原理以及如何启用它的更多详细信息,请参阅: