我有一个类似这样的过程:
但是,每次背景和前景vim出现时,bash / zsh都会打印两条如下所示的消息:
[1] + 4321 continued nvim
[1] + 4321 suspended nvim
这些很烦人,因为它们占用了屏幕空间,最终结果过滤掉了屏幕。我必须重新运行该命令或连续上下滚动才能找到它。
有没有一种方法可以获取“续/挂起”消息,从而避免添加太多换行符?或者,我可以完全抑制它们吗。
答案 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);