![在 shell 中,当我在后台运行进程时,如何获取“[作业编号] [PID]”,重定向到文件?](https://linux22.com/image/168430/%E5%9C%A8%20shell%20%E4%B8%AD%EF%BC%8C%E5%BD%93%E6%88%91%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E8%BF%9B%E7%A8%8B%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E2%80%9C%5B%E4%BD%9C%E4%B8%9A%E7%BC%96%E5%8F%B7%5D%20%5BPID%5D%E2%80%9D%EF%BC%8C%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想重定向该命令的输出firefox &
。我知道添加&
意味着我们将在后台运行该命令,当我们使用它时,我们会收到[number of process in background] [PID]
.这就是我所做的:
firefox & > firefoxFile
但当我打开时firefoxFile
,却发现里面空空如也。我没找到[number of process in forground] [PID]
。
答案1
在你的评论中你写道
我想找到后台进程的pid和数量
那这个呢
firefox &
pid=$!
echo "The PID for the background process is $pid" >&2
获得 PID 后,您当然可以将其值写入您选择的任何文件中。
答案2
如果您的 shell 是 bash[1],您可以尝试:
exec 3>&2 2>firefoxFile; firefox & exec 2>&3-
这是您的 shell(例如 bash)将[jobnum] pid
后台作业通知打印到标准错误,不是火狐浏览器。这个组合暂时将 stderr 重定向到文件firefoxFile
,并将该通知捕获到其中和Firefox 在其生命周期内将写入 stderr 的任何内容。
[jobnum] Done firefox
当后台作业终止时,它不会捕获将打印的 bash。
你的firefox & > file
将被解析为两个命令1. firefox &
(它将firefox
在后台运行)和2. > file
(它将截断file
而不写入任何内容)。这肯定不是你想要的。
[1]你可以阅读这里为什么这个技巧在其他 shell 中不起作用;虽然可以在 中重定向 stderr zsh
,zsh
但不会将其提示和作业通知写入 stderr,而是写入指向当前终端的另一个 fd,专门为此目的而打开。
答案3
这并不准确,但很接近。您只需要添加一点sed
。
firefox &
jobs -l | grep -E "\[[0-9]+\]\+" > firefoxFile