静静地在后台启动流程

时间:2016-02-28 22:35:50

标签: bash fork

在命令末尾附加&会在后台启动它。 E.g:

$ wget google.com &
[1] 7072

但是,这会打印一个作业编号和PID。是否有可能阻止这些?

注意:我仍然希望保留wget的输出 - 它只是我想摆脱的[1] 7072

2 个答案:

答案 0 :(得分:1)

set builtin set -b有一个选项可以控制此行的输出,但选择仅限于"立即" (设置时)和"等待下一个提示" (未设置时)。

设置选项后立即打印的示例:

$ set -b
$ sleep 1 &
[1] 9696
$ [1]+  Done                    sleep 1

通常的行为,等待下一个提示:

$ set +b
$ sleep 1 &
[1] 840
$ # Press enter here
[1]+  Done                    sleep 1

据我所见,这些都无法被抑制。但好消息是,作业控制消息不会显示在非交互式shell中:

$ cat sleeptest
#!/bin/bash
sleep 1 &
$ ./sleeptest
$

因此,如果您在子shell 中的后台中启动命令,则不会有任何消息。要在交互式会话中执行此操作,您可以在子shell中运行命令(感谢David C. Rankin):

$ ( sleep 1 & )
$

也导致没有作业控制提示。

答案 1 :(得分:-1)

来自Advanced Bash-Scripting Guide

  

压制stdout

cat $filename >/dev/null
# Contents of the file will not list to stdout.
     

压制stderr(来自Example 16-3)。

rm $badname 2>/dev/null
#           So error messages [stderr] deep-sixed.
Suppressing output from both stdout and stderr.
cat $filename 2>/dev/null >/dev/null
#1 If "$filename" does not exist, there will be no error message         output.
# If "$filename" does exist, the contents of the file will not list to stdout.
# Therefore, no output at all will result from the above line of code.
#
#  This can be useful in situations where the return code from a command
#+ needs to be tested, but no output is desired.
#
# cat $filename &>/dev/null
#     also works, as Baris Cicek points out.