背景和前景bash/zsh作业,无需在“中添加换行符”;续/暂停“;信息

背景和前景bash/zsh作业,无需在“中添加换行符”;续/暂停“;信息,bash,vim,zsh,foreground,job-control,Bash,Vim,Zsh,Foreground,Job Control,我有一个过程是这样的: [1] + 4321 continued nvim [1] + 4321 suspended nvim (myCommand &) #Hit enter: user@domain~$ % vi [1] + Stopped vi % ff % ff % ff #include <stdio.h> #include <signal.h> void signalHandler(int sig_num) { //

我有一个过程是这样的:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
(myCommand &) #Hit enter:
user@domain~$
% vi

[1] + Stopped vi
% ff
% ff
% ff
#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); 
  • 运行一个命令,在一堆文件中生成一堆结果
  • 在vim中打开一个文件
  • 编辑其中一个结果
  • 背景vim,获取下一个结果,前景vim
  • 重复此操作,直到完成列表
但是,每次我在后台和前台使用vim时,bash/zsh都会打印两条如下所示的消息:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
(myCommand &) #Hit enter:
user@domain~$
% vi

[1] + Stopped vi
% ff
% ff
% ff
#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); 
这些都很烦人,因为它们占用了屏幕空间,最终结果会从屏幕上过滤掉。我必须重新运行该命令或不断地上下滚动才能找到它

有没有办法获得“continued/suspended”消息以避免添加这么多新行?或者,我可以完全抑制它们。

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

backgroundRun.sh
|
tmp
|
|_ outFile.txt
下面是
backgroundRun.sh
的外观:

backgroundRun.sh:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
代码输出:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
工作原理:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
基本概念是,在后台运行时,
myCommand
(查看
backgroundRun.sh
)的所有输出都存储在
tmp/outFile.txt

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


这是一种有效的方法。这一个的问题是输出会在屏幕上产生回声(如果你有)。只需一个简单的命令,如下所示:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
(myCommand &) #Hit enter:
user@domain~$
% vi

[1] + Stopped vi
% ff
% ff
% ff
#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); 
工作原理: 这段代码是关于简单性的;它所做的只是在子shell中执行命令(在后台)


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

backgroundRun.sh:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
代码输出:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
工作原理:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &
myCommand & > /dev/null 2>&1
它运行命令,将其输出到
/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
时(再次键入blind),将返回到
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。 从现在起,会议将如下所示:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
(myCommand &) #Hit enter:
user@domain~$
% vi

[1] + Stopped vi
% ff
% ff
% ff
#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); 
不要在整个bash中全局关闭诊断消息,因为这样在控制台中工作将非常困难。您如何知道命令执行是否正确或失败

编辑: 一张小纸条。SIGTSTP内核负责将进程发送到后台。通常运行CTRL+Z(或有时CTRL+Y),它的数字是20。你可以通过编程方式调用它,比如kill-20 为了消除反馈,您必须覆盖SIGTSTP信号服务。 值得的?如果是: 在C中,这样写:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
(myCommand &) #Hit enter:
user@domain~$
% vi

[1] + Stopped vi
% ff
% ff
% ff
#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); 
#包括
#包括
无效信号处理器(int sig_num)
{ 
//这是一个处理信号的新代码
//信号(SIGTSTP等)。
} 
信号(SIGTSTP,信号处理器);

听起来确实很烦人。您是否考虑过使用ex命令,
:terminal
(Vim 8.1功能)来保持shell提示符打开(或考虑过使用终端多路复用器)或者将结果写入临时文件并在Vim中拆分,我想您可以在
zsh/jobs.c
中注释掉
fprint
调用并自己编译zsh…您可以使用
屏幕
?这看起来像是一个重复的问题: