具体的には、Firefoxを起動するスクリプトを作成し、そのスクリプトをダブルクリックして「ターミナルで実行」を選択しましたが、シェルが終了するとすぐにFirefoxが終了しました。
これが起こらないようにするにはどうすればよいですか?
答え1
nohup
launch コマンドの前に置く必要があるため、firefox
次のようにする必要があります。
>$ nohup firefox
答え2
また、Firefoxを前景ではなくバックグラウンドジョブとして実行する必要があります。なぜなら、シェルは親であり、プロンプトを返す前にFirefoxが起動して終了するのを待つからです。
答え3
オンラインで見つけることができるほとんどのソリューションは、Firefoxのスクリプトをサブシェルで実行します。サブシェルが終了したら、制御権を再取得します。 Firefoxスクリプトがバックグラウンドで実行されると、その変更と変数の設定は表示されず、親シェル(実際のシェル)が終了してもバックグラウンドで実行できます。
その主な理由は、bashを含むシェルが2つの間に非常に明確な違いがあるためです。
- インタラクティブモード:プロンプトを表示し、ユーザーのコマンドを読み取り、ループで実行します。
- そして非対話型モード:この場合、デフォルトではシェルスクリプトを解釈するインタプリタ言語で実行されます。
スクリプトが実行された後(今回はFirefoxランチャー/ラッパースクリプト)、bashを非対話型スクリプトモードから対話型スクリプトモードに変更する簡単な方法はありません。
これは可能ですが、私が知っている限り、これに対するシェルサポートはありません。
幸いなことに、目標を達成するには難しい方法がたくさんあります。
- 非対話型スクリプトをbashの初期化ファイルとして実行できます。だから:
bash --bashrc /here/is/what/i/want.sh
。 /here/is/what/i/want.sh
独自のインタプリタを変更してやり直すことができますが、今はインタラクティブモードです。これはコマンドで行うことができますexec /bin/bash -i
。ただスクリプトの最後に入れてください。