GNU/Linux >> Linux の 問題 >  >> Linux

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

実行中のアプリケーションに焦点を合わせるか、実行されていない場合は起動するために、短い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の出力が表示されます。 順序が間違っているようです。


Linux
  1. Bashスクリプト実行からのRsync不明なオプション?

  2. Bashスクリプトでスペースをエスケープできないのはなぜですか?

  3. Bashスクリプトでクリップボードとの間でパイプする

  1. バッシュ演算子の違い[[Vs[Vs(Vs((?

  2. ログイン後に bash スクリプトを実行する

  3. -e は bash シバンで何をしますか?

  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. 〜/ .bash_profileが機能しないのはなぜですか?

  3. フォルダから最も古いファイルを削除するためのBashスクリプト?