背景和前景bash / zsh作业,无需在“续/挂起”消息中添加换行符

时间:2019-02-08 23:38:37

标签: bash vim zsh foreground job-control

我有一个类似这样的过程:

  • 运行一个在大量文件中生成大量结果的命令
  • 在vim中打开文件
  • 编辑结果之一
  • 后台vim,获取下一个结果,前台vim
  • 重复直到列表完成

但是,每次背景和前景vim出现时,bash / zsh都会打印两条如下所示的消息:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim

这些很烦人,因为它们占用了屏幕空间,最终结果过滤掉了屏幕。我必须重新运行该命令或连续上下滚动才能找到它。

有没有一种方法可以获取“续/挂起”消息,从而避免添加太多换行符?或者,我可以完全抑制它们吗。

3 个答案:

答案 0 :(得分:6)

执行此操作的方法:


这不是执行此操作的最有效方法,但这是一种有效的方法。这是一个假定的文件结构:

backgroundRun.sh
|
tmp
|
|_ outFile.txt

backgroundRun.sh的外观如下:

backgroundRun.sh:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &

代码输出:

./backgroundRun.sh
user@domain~$

工作原理:

基本概念是myCommand的所有输出(看backgroundRun.sh)都存储在tmp/outFile.txt中,同时在后台运行。

PS:outFile.txt将是一个空文件(占位符)。


这是一种有效的方法。这个问题是输出将被回显到屏幕上(如果有的话)。就像这样一个简单的命令:

(myCommand &) #Hit enter:
user@domain~$

工作原理: 这段代码是关于简单性的。它所做的只是子外壳中的命令(在后台)。


这是另一种有效的方法。在这里,您只需要一个文件:backgroundRun.sh。这是代码:

backgroundRun.sh:

myCommand & > /dev/null 2>&1

代码输出:

./backgroundRun.sh
user@domain~$

工作原理:

它运行命令,并将其输出到/dev/null。如果这样不起作用,则会显示错误(2>&1)。

PS:此代码仅在* nix / POSIX系统上有效,因为/dev/null在其他操作系统中不存在

答案 1 :(得分:5)

并非完整的解决方案,但行数超出注释的限制...

以下方法减少了空行的数量(仅在vi上用Raspbian / Debian上的bash进行了测试)。关键步骤是在交互模式下启动嵌套的bash,但隐藏stderr的输出:

bash -i 2>/dev/null

这会暂时抑制作业控制消息,但也会隐藏交互式外壳,因此您需要放心键入,例如:

vi firstfile

然后,当您为vi设置背景(例如 Ctrl Z )时,通常的[1]+ Stopped vi firstfile消息将被抑制。这是到目前为止的总输出:

~ $ bash -i 2>/dev/null

键入fg(再次键入盲注)时,将返回到vi会话。但是,下次您为vi设置背景时,这将显示另一行输出,确认先前的前景:

~ $ bash -i 2>/dev/null
vi firstfile

这是对大多数不希望有的行的改进,但是随后的每个fg都会提示另外一条反馈行。可以通过输入以下内容来“解决”此问题:

fg>a

-a是一个伪文件,带有一个短名称以保存键入fg>/dev/null

这足以完全停止作业控制输出。几个shell脚本会有所帮助,但是感觉可以进一步完善……我期待看到更多答案。

答案 2 :(得分:1)

如果使用VIM,为什么要暂停vim?您只需要一个序列:

% vim
:! youShellCommands
:e youFilename
.... over and over again

这可以更优雅地解决该问题,而无需禁用诊断消息。

OR

在bash中,输入以下功能:

function ff() { fg 2> /dev/null 1>&2 ; }

并使用ff代替fg。 从现在开始,会话将如下所示:

% vi

[1] + Stopped vi
% ff
% ff
% ff

请勿为整个bash全局关闭诊断消息,因为那样在控制台中工作将非常困难。您怎么知道命令执行正确还是失败。

编辑: 一个小笔记。 SIGTSTP内核负责将进程发送到后台。通常运行CTRL + Z(有时是CTRL + Y),它的编号为20。您可以通过编程方式调用它,例如,通过kill -20 PIDNumber 为了摆脱反馈,您必须覆盖SIGTSTP信号服务。 值得?如是: 在C中这样写:

#include <stdio.h> 
#include <signal.h> 

void signalHandler(int sig_num) 
{ 
    // here is a new code for handling the signal
    // signal(SIGTSTP, ...etc.     
} 

signal(SIGTSTP, signalHandler);