重新路由 pid 输出

重新路由 pid 输出

大家好,

假设我有一个 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工作完成后你仍会看到类似的东西。

相关内容