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



如果我在后台运行一个作业,比如在文件尾部执行一个非常特定的grep,即tail -f /var/log/syslog | grep -i failure,则该命令的输出将打印到我的终端,从而打断我键入的任何内容。

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

在BASH中,我认为有一个键组合可以恢复正在键入的命令字符串,但我想不起来或找到那个键组合是什么

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

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

如果你想启用这个特性,你需要找到一些键序列来绑定命令。例如,您可以将Ctrl+L绑定到redraw-current-line,并对clear-screen使用EscCtrl+L

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

当然,这只是为了实验;它只在当前终端会话中有效。你需要把它放入你的bash启动文件中,使它具有粘性。

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

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

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

最新更新