![将进程发送到后台并拒绝并退出终端(& 和 && 运算符在 zsh 中发生冲突)](https://linux22.com/image/170887/%E5%B0%86%E8%BF%9B%E7%A8%8B%E5%8F%91%E9%80%81%E5%88%B0%E5%90%8E%E5%8F%B0%E5%B9%B6%E6%8B%92%E7%BB%9D%E5%B9%B6%E9%80%80%E5%87%BA%E7%BB%88%E7%AB%AF%EF%BC%88%26%20%E5%92%8C%20%26%26%20%E8%BF%90%E7%AE%97%E7%AC%A6%E5%9C%A8%20zsh%20%E4%B8%AD%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81%EF%BC%89.png)
我需要在后台运行一个进程,然后退出当前终端。
以下命令会导致错误:
> google-chrome-stable &! && exit
zsh: parse error near '&&'
我考虑过简单地调用“google-chrome-stable &!”并通过 if 语句检查错误代码,但希望找到一种更简单的方法来完成此操作。
答案1
&!
和&&
两个单独的命令,所以你不能将两者结合起来,所以
google-chrome-stable &! exit
可能就是你所追求的。
在后台命令退出之前,您无法获取退出代码...
答案2
从启动后台作业返回到调用 shell 的退出状态是总是零:
% bogus &
[1] 66712
% zsh: command not found: bogus
[1] + exit 127 bogus
% echo $?
0
... 和&!
都是&&
命令终止符。这意味着你的命令可能应该写成
google-chrome-stable &! exit
或作为等价物
google-chrome-stable &!
exit
wait
您只能通过使用作业的作业 ID(因为您否认了它,所以没有)或进程 ID(但您不能,因为您否认了该进程,因此无法获取后台作业的真实退出状态)不再是 shell 视为子进程的进程;它已从 shell 的当前作业列表中删除)。
如果你没有放弃这份工作,也许通过
google-chrome-stable & chrome_pid=$!
那么该命令wait $chrome_pid
最终会以后台作业的退出状态退出,但直到该作业终止(由于无法启动或通过某种方式关闭浏览器)。