実行後にbashスクリプトが終了しないのはなぜですか?

実行後にbashスクリプトが終了しないのはなぜですか?

実行中のアプリケーションに集中したり実行していない場合は、始めるために短いbashの1行コードをコンパイルしました。

#!/bin/bash
#intellilaunch.sh

wmctrl -a $1 || $1 & disown
exit 1

コマンドラインから直接実行すると、コマンドは完全に終了します。

:~$ wmctrl -a firefox || firefox & disown
[1] 32505

システムモニタをすばやく確認すると、Firefoxだけが実行されていることがわかります。

ただし、./intellilaunch.sh firefoxスクリプト()を介してFirefoxを起動すると、intellilaunch.sh firefoxFirefoxを閉じた後にのみ終了するという継続的な新しいプロセスが作成されます。

私は何が間違っていましたか?

編集する:

michasの提案に従ってスクリプトを修正しました。

#!/bin/bash

program=$(basename $1)

if ! wmctrl -a "$program"; then
  "$1"&
fi

もう1行のテキストはありませんが、今は本当にうまくいきます!

答え1

私のシステムではこの動作を再現できません。あなたの説明によると、バックグラウンドで正しく設定されていないプロセスがあるようです。

次に実行してみてくださいbash -x intellilaunch.sh xclock。それから何が起こっているのかを知ることができます。

また、||バインディングよりも強力な&ので、パイプライン全体をバックグラウンドで送信します。おそらく明示的なのはif良い考えです。

あなたの

wmctrl -a firefox || firefox & disown ; exit 1

として説明された

( wmctrl -a firefox || firefox ) & disown ; exit 1

そして、あなたはおそらく意味

wmctrl -a firefox || ( firefox & disown ) ; exit 1 

したがって、bash は wmctl と firefox を使用するタスクと disown とシャットダウンを使用するタスクの 2 つのタスクを開始します。バックグラウンド・ジョブは、開始に時間が短いため、コマンドが少し遅く開始される可能性があり、これは出力順序がbash -x間違っているように見えます。

関連情報