当打印到stdout的消息中断我正在键入的命令时,如何在命令行(BASH)上恢复损坏的命令字符串?

时间:2013-06-18 18:38:51

标签: bash

如果我有一个在后台运行的作业,就像文件尾部的一个非常特定的grep,即tail -f /var/log/syslog | grep -i failure,该命令的输出将被打印到我的终端,从而破坏了我输入的内容

这相当于Cisco路由器中“vty”或“con”行中的“logging synchronous”。我知道在思科设备中,如果未启用“日志记录同步”并且您在终端上输入内容,则任何向终端吐出的内容都会中断您正在键入的内容。如果在终端上启用“logging synchronous”,则消息仍然会吐出,但您输入的命令字符串会立即恢复到下一行。

在BASH中,我有一个键组合可以恢复正在键入的命令字符串,但我无法回想起或找出那个键组合是什么。

3 个答案:

答案 0 :(得分:1)

我通常按 Ctrl + L 。缺点是它也会清除屏幕。

答案 1 :(得分:1)

我对该问题的个人解决方案是将后台作业的输出重定向到文件,例如。     tail -f / var / log / syslog | grep -i failure> foo.myout

我认为由于某种原因这是不可能的。你试过control-p吗?

答案 2 :(得分:1)

您输入的行未按输出更改。唯一的问题是你再也看不到了。

有一个readline命令redraw-current-line,就像它说的那样,重绘当前行。默认情况下,bash不会将该命令绑定到任何键序列,这使得使用起来有点尴尬。 Bash将 Ctrl + L 绑定到clear-screen命令,该命令也将重绘当前行,但清除屏幕的副作用可能有点不受欢迎。

如果要启用此功能,则需要找到一些将命令绑定到的键序列。例如,您可以将 Ctrl + L 绑定到redraw-current-line,并使用 Esc Ctrl + L 获取clear-screen。要做到这一点:

bind '"\C-l"':redraw-current-line
bind '"\e\C-l"':clear-screen

当然,那只是为了实验;它只会在当前终端会话中生效。您需要将它放入bash启动文件中,以使其粘滞。