我有一个类似这样的过程:
但是每次我在后台和前台vim时,bash / zsh会打印两条看起来像这样的消息:
[1] + 4321 continued nvim
[1] + 4321 suspended nvim
这些都很烦人,因为它们会占用屏幕空间并最终将结果过滤掉屏幕。我必须重新运行命令或不断向上和向下滚动才能找到它。
有没有办法获得“继续/暂停”消息,以避免添加这么多换行符?或者,我可以完全压制它们吗?
这不是最有效的方法,但它是一种工作方法。这是一个假定的文件结构:
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
不存在于其他操作系统中
不是完整的解决方案,但比评论更多的行将允许......
以下工作是为了减少空白行的数量(在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脚本会有所帮助,但感觉它可以进一步细化......我期待看到更多的答案。
如果您使用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);