実行中のアプリケーションに集中したり実行していない場合は、始めるために短い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 firefox
Firefoxを閉じた後にのみ終了するという継続的な新しいプロセスが作成されます。
私は何が間違っていましたか?
編集する:
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
間違っているように見えます。