実行中のアプリケーションに焦点を合わせるか、実行されていない場合は起動するために、短いbashワンライナーをコンパイルしました:
#!/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 firefox
と呼ばれる永続的な新しいプロセスを生成します 、Firefoxを閉じた後にのみ終了します。
何が間違っているのですか?
編集 :
michasの提案に従ってスクリプトを変更しました:
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
もはやワンライナーではありませんが、今では完全に正常に機能しています!
承認された回答:
この動作をシステムで再現できません。あなたの説明から、バックグラウンドに適切に設定されていないプロセスがあるように聞こえます。
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は2つのジョブを開始します。1つはwmctlとfirefoxを使用し、もう1つはdisownとexitを使用します。バックグラウンドジョブの起動には短時間が必要なため、コマンドが少し遅れて開始される可能性があります。そのため、bash -x
の出力が表示されます。 順序が間違っているようです。