背景和前景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
- 重复此操作,直到完成列表
[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…您可以使用屏幕
?这看起来像是一个重复的问题: