大家好,
假设我有一个 bash 文件。
echo "Hey!"
echo "Hay!"
bash ~/otherstuff.sh &
最后一行让我很烦。我希望它在后台完成,从技术上讲确实如此。但每次启动时,它都会输出[1] 21345
,即进程 ID。我尝试了我所知道的所有重新路由,但都不起作用。
TL;DR 隐藏进程输出,它甚至被认为是stdout
?
我所拥有的最好的是sh -c '. ~/otherstuff.sh' & disown
,它隐藏了“完成”的输出,但不隐藏原始输出。
干杯!Bobbbay
答案1
这[1] 21345
不是来自您异步运行的进程,而是来自您正在工作的交互式 Bash。
非交互式的bash
或者sh
不应该写这个,所以让它异步运行任务:
bash -c 'whatever &'
# or
sh -c 'whatever &'
笔记:
- 这会将标准输入重定向
whatever
到/dev/null
或等效文件。 - 该任务不会成为主 shell 中的作业(
jobs
不会列出它),您将无法简单地将其带到前台fg
。
要whatever &
在主 shell 中作为作业运行而不进行打印[1] 21345
等操作,您需要处理主 shell 的文件描述符。Bash 会打印[1] 21345
到其 stderr,我们需要暂时重定向它:
exec 12>&2 2>/dev/null; whatever & 2>&12; exec 2>&12 12>&-
笔记:
- 这使用文件描述符
12
。如果它与你正在做的事情发生冲突,请选择另一个数字(或使用{varname}>…
)。 whatever
将在 stderr 恢复的情况下运行。- 主 shell 在实际运行时遇到的任何问题
whatever
(例如command not found
)都将被忽略,因为此时 shell 的 stderr 是/dev/null
。 [1] Done
工作完成后你仍会看到类似的东西。