假设我有一个进程在前台的终端中运行。当它处于活动状态时,我可以键入命令,按回车键,一旦过程完成,这些命令就会被执行。
现在进一步说我想输入控制字符而不仅仅是“普通”字母。由于某种原因,这些控制字符会按字面意思回显,但一旦前台进程完成,就无法正确解释。
请允许我用一个例子来说明这个问题:
deso@XXX ~ $ sleep 10
echo test
deso@XXX ~ $ echo test
test
当睡眠处于活动状态时,我输入“echo test”(然后按回车键),它会在 10 秒后执行。现在在同一个终端中(这是我看到的文字输出):
deso@XXX ~ $ sleep 10
^R
echo
deso@XXX ~ $ echo
deso@XXX ~ $
我的目的是在睡眠处于活动状态时调用 readline 的反向历史搜索功能(这应该找到我之前输入的“回声测试”)。如果 shell 正在等待我的输入,则 Ctrl-R 可以完成此任务。对于活动进程,Ctrl-R 似乎会被忽略(至少它不会启动反向历史搜索)。这都是在 Linux 上(使用 xterm + tmux + bash;但我尝试不使用 tmux 并使用 busybox 而不是 bash)。
现在有趣的是,在VMware ESX(使用busybox,即ash,作为shell)上,事情按预期工作,也就是说,控制字符不会按字面意思回显,而是被接受为控制字符并被解释(与前台进程完成后剩余的字符)。这意味着在上面的示例中,将调用历史搜索,将找到最后一个“echo”命令(“echo test”)并将其执行。
我的问题是:谁影响了这种行为?终端、shell、内核?有没有办法让 Linux 在这方面表现得像 ESX?正如我提到的,我已经尝试使用不同的 shell(bash 和 ash)和不同的终端模拟器(xterm 和 urxvt)进行相同的实验。行为总是一样的。