sta*_*tti 38 unix parallel-processing bash shell
在后台运行作业时,Bash非常冗长:
$ echo toto&
toto
[1] 15922
[1]+ Done echo toto
Run Code Online (Sandbox Code Playgroud)
由于我试图并行运行作业并使用输出,我想找到一种方法来沉默bash.有没有办法删除这个多余的输出?
Tod*_*obs 44
您可以使用括号在子shell中运行后台命令,这将使作业控制消息静音.例如:
(sleep 10 & )
Run Code Online (Sandbox Code Playgroud)
mkl*_*nt0 30
注意:以下内容适用于交互式 Bash会话.在脚本中,永远不会打印作业控制消息.
有2个基本场景的沉默bash的作业控制信息:
CodeGnome的有用答案答案建议将后台命令括在一个简单的子shell中 - 例如,(sleep 10 &)
- 有效地使作业控制消息无效 - 无论是在创造就业机会还是在作业终止时.
这有一个重要的副作用:
&
内部子shell,你失去了后台作业的控制 - jobs
就不一一列举了,既不%%
(规范(ID)最近推出的职业.)也不是$!
(启动了(最后一个)进程的PID(作为最近工作的一部分)将反映它.[1]对于启动 - 忘记方案,这不是问题:
[1]可以想象,您可以通过搜索与其命令行匹配的运行进程来自己查找该进程,但这很麻烦且不易于实现.
如果您想继续控制工作,以便以后可以:
需要一种不同的方法:
沉默创造就业,控制消息是以下处理,但为了 沉默终止作业控制消息明确,必须打开作业控制shell选项OFF:
set +m
(set -m
重新打开)/dev/null
而不是当前的shell.man bash
和(不区分大小写)搜索"作业控制"的出现.要使创建作业控制消息静音,请将后台命令包含在组命令中,并将后者的stderr输出重定向到/dev/null
{ sleep 5 & } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)以下示例说明如何在原则上保留对作业的控制的同时静静地启动后台作业.
$ set +m; { sleep 5 & } 2>/dev/null # turn job-control option off and launch quietly
$ jobs # shows the job just launched; it will complete quietly due to set +m
Run Code Online (Sandbox Code Playgroud)
如果你不希望关闭作业控制选项(set +m
),沉默的唯一途径终止作业控制消息是要么kill
工作或wait
为它:
警告:有两种边缘情况,这种技术仍然产生输出:
安静地开始工作(如上所述,但没有set +m
):
$ { sleep 5 & } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
要wait
为它悄然:
$ wait %% 2>/dev/null # use of %% is optional here
Run Code Online (Sandbox Code Playgroud)
为了kill
它静静:
{ kill %% && wait; } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
附加wait
是必要的,以使终止作业控制消息通常由Bash 异步显示(在实际进程终止时,在kill之后不久)同步输出wait
,然后允许静默.
但是,如上所述,如果作业本身完成,则仍会显示作业控制消息.
归档时间: |
|
查看次数: |
9224 次 |
最近记录: |