13

我有一个过程是这样的:

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

但是,每次我在后台和前台使用 vim 时,bash/zsh 都会打印两条如下所示的消息:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim

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

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

4

3 回答 3

6

执行此操作的方法:


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

backgroundRun.sh
|
tmp
|
|_ outFile.txt

以下是backgroundRun.sh外观:

背景运行.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~$

它是如何工作的: 这段代码是关于简单的;它所做的只是子shell中的命令(在后台)。


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

背景运行.sh:

myCommand & > /dev/null 2>&1

代码输出:

./backgroundRun.sh
user@domain~$

这个怎么运作:

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

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

于 2019-03-10T03:06:10.220 回答
5

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

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

bash -i 2>/dev/null

这将立即抑制作业控制消息,但它也会隐藏交互式外壳,因此您需要自信地键入,例如:

vi firstfile

然后当你背景vi(例如CtrlZ)时,通常的[1]+ Stopped vi firstfile消息会如预期的那样被抑制。这是到目前为止的总输出:

~ $ bash -i 2>/dev/null

输入时fg(再次输入盲文),这会将您返回到vi会话。但是,下次您使用 backgroundvi时,这会显示另一行输出,确认之前的前景:

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

这是对大多数不受欢迎的行的改进,但每个后续fg都会提示多行反馈。这可以通过键入以下内容来“解决”:

fg>a

-a只是一个虚拟文件,有一个短名称来保存输入fg>/dev/null

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

于 2019-03-12T23:44:22.530 回答
2

如果你使用 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); 
于 2019-03-15T19:01:27.420 回答