后台和前台bash / zsh作业,而不在“继续/暂停”消息中添加换行符

问题描述 投票:12回答:3

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

  • 运行一个命令,在一堆文件中生成一堆结果
  • 在vim中打开一个文件
  • 编辑其中一个结果
  • 背景vim,得到下一个结果,前景vim
  • 重复直到列表完成

但是每次我在后台和前台vim时,bash / zsh会打印两条看起来像这样的消息:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim

这些都很烦人,因为它们会占用屏幕空间并最终将结果过滤掉屏幕。我必须重新运行命令或不断向上和向下滚动才能找到它。

有没有办法获得“继续/暂停”消息,以避免添加这么多换行符?或者,我可以完全压制它们吗?

bash vim zsh foreground job-control
3个回答
6
投票

Methods to do this:


这不是最有效的方法,但它是一种工作方法。这是一个假定的文件结构:

backgroundRun.sh
|
tmp
|
|_ outFile.txt

以下是backgroundRun.sh的样子:

background run.是:

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

代码输出:

./backgroundRun.sh
user@domain~$

这个怎么运作:

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

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


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

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

工作原理:此代码简单易懂;它所做的只是子shell中的命令(在后台)。


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

background run.是:

myCommand & > /dev/null 2>&1

代码输出:

./backgroundRun.sh
user@domain~$

这个怎么运作:

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

P.S:此代码仅适用于* nix / POSIX系统,因为/dev/null不存在于其他操作系统中


5
投票

不是完整的解决方案,但比评论更多的行将允许......

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

bash -i 2>/dev/null

这会暂时抑制作业控制消息,但它也会隐藏交互式shell,因此您需要自信地键入,例如: :

vi firstfile

然后当你背景vi(例如CtrlZ)时,通常的[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脚本会有所帮助,但感觉它可以进一步细化......我期待看到更多的答案。


1
投票

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

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

这样可以更加优雅地解决问题,并且不会禁用诊断消息。

要么

在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); 
© www.soinside.com 2019 - 2024. All rights reserved.