web-dev-qa-db-ja.com

プロセスをバックグラウンドに送信し、端末の所有権を剥奪して終了します(zshでの&および&&演算子の衝突)

バックグラウンドでプロセスを実行してから、現在のターミナルを終了する必要があります。

次のコマンドはエラーになります:

> google-chrome-stable &! && exit
zsh: parse error near '&&'

単に「google-chrome-stable&!」を呼び出すことを検討しました。 ifステートメントを介してエラーコードをチェックしますが、これを達成するためのより簡単な方法を特定したいと考えています。

1
Ian Melendez

&!および&&両方とも別々のコマンドなので、両方を組み合わせることができないので、

google-chrome-stable &! exit

おそらくあなたが求めているものです。

バックグラウンドコマンドが終了するまで、終了コードを取得できません...

2
Stephen Kitt

バックグラウンドジョブの開始から呼び出し元のシェルに返される終了ステータスは常にゼロです:

% 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(ただし、できません。そのプロセスを勘当したため、シェルが子プロセスと見なすプロセスではなくなりました。シェルの現在のジョブのリストから削除されます)。

あなたが仕事を勘当していなかったなら、多分

google-chrome-stable & chrome_pid=$!

次にコマンドwait $chrome_pidは最終的にバックグラウンドジョブの終了ステータスで終了しますが、開始できないか、何らかの方法でブラウザを閉じることにより、そのジョブが終了するまでは終了しません。

1
Kusalananda