现在的情况:当应用程序/脚本从终端作为后台进程启动并向控制台提供输出(即 STDOUT,因此没有输出重定向)时,当我在终端中键入某些内容并且正在运行的进程向终端输出某些内容时同样在同一时刻,进程的输出被“附加”到我当时输入的任何内容中,因此在视觉上输入和输出是乱码的。
期望的结果:我想知道每当后台进程在终端上显示其输出时是否可以将“到目前为止键入的”输入跳转到下一行(即输入文本始终自动显示在最后一行,与正在进行的输出分开)。
基本上我正在寻找一种方法来达到与“记录同步" 命令允许在 Cisco 设备上的 IOS 中使用(更好地举例说明这里)一旦启用,只要在键入过程中显示任何“系统相关”输出,它就会将您到目前为止键入的所有内容放在新行(始终是最后一行)中。
附加内容: 我知道,即使在视觉上输入和输出文本混合在一起,如果我继续输入命令并按 Enter 键,它会执行得很好,只是很难弄清楚确切地当输出让你措手不及时,你输入了什么。
我使用的是带有 Gnome 的 Debian Jessie,因此我使用带有默认 Gnome 终端的 Bash,但在使用虚拟控制台时(例如在 CTRL+ALT+F1 之后)也会出现相同的行为。
我不确定是否有一些非常简单、众所周知且明显的方法可以做到这一点,但我一直在寻找上一小时的大部分时间但无济于事,所以如果这是一个我很抱歉不用想也知道。
或者此功能(如果存在)是否取决于所使用的终端应用程序?
感谢您的任何意见。
答案1
一种选择是在后台作业时将 STDOUT 和 STDERR 重定向到文件。
ls &> job.txt &
[1] 13160
[1]+ Done ls &>job.txt
然后检查正在运行的作业
jobs
[1]+ Running yes &>/dev/null &
您还可以将它们放在前台并中断或查看job.txt
以检查它们的状态(假设它们不缓冲输出)。
fg 1
当作业完成时,您应该在下一个命令完成后在终端中收到通知(在 bash 中这不会中断您的命令输入)。
我认为您没有这样做是有原因的。我不确定你是否可以在后台使用Crtl-z并获得 I/O 重定向。
答案2
据我所知,不存在自动“神奇”的方式。
如果您的终端处于熟模式(就像运行既不是全屏也没有 readline 支持或类似的简单应用程序时的情况一样cat
),您可以按终端规则的“重印”字符,对我来说是Ctrl+ ,R请参阅rprnt
的stty
手册页和stty -a
的输出。这将跳转到下一行并重新打印您正在键入的文本。
如果您正在运行全屏或读取行感知的应用程序,它们可能都有自己的方式(通常是Ctrl+R或Ctrl+ L)来重新绘制屏幕或当前行。