gnome-open
コマンドを使用して、特定のファイル(主にpdfファイル)を開くbash
スクリプトを作成しようとしています。また、pdfファイルを開いたら、端末を終了させます。
スクリプトの最後にexit
を追加しようとしましたが、端末を閉じません。私は私の質問への答えをオンラインで検索しようとしましたが、適切なものを見つけることができませんでした。
すべての端末ではなく、コマンドを実行した端末を強制終了するだけの回答が必要ですか?私が受け入れた以前の回答は、開いているすべてのターミナルウィンドウを強制終了します。今日までこれが事実だとは思いませんでした。
1つのファイルのみを開く場合、実際にスクリプトを使用する必要はありません。スクリプトは複数のコマンドを連続して実行する簡単な方法であるため、ここでは、2つのコマンド(exit
を含む)を実行するだけです。
コマンドまたはコマンドチェーンの後にexit
を実行する場合は、&&
演算子(前のコマンドまたはコマンドチェーンが成功すると次を実行する)を使用して、既にあるものにチェーンできます。コマンド)または;
演算子を使用して(前のコマンド/コマンドチェーンの成功と失敗の両方で次のコマンドを実行します)。
この場合、次のようになります。
gnome-open <path_to_pdf_file> && exit
* <path_to_pfd_file> = pdfファイルのパス
スクリプトの最後に置かれたexit
は、スクリプトが実行されるbash
インスタンスを単に終了するため、機能しません。これは、ターミナルの内部bash
インスタンスとは別のbash
インスタンスです。
とにかくスクリプトを使用する場合、最も簡単な方法は、次のようにスクリプトを呼び出すことです。
<path_to_script> && exit
または、スクリプトが次のようにターミナルの現在の作業ディレクトリにある場合:
./<script> && exit
あなたが本当にそれをしたくない/できない場合、2番目の最も簡単な方法は、スクリプトの最後にこの行を追加することです:
kill -9 $PPID
これにより、SIGKILL
信号がスクリプトの親プロセス(ターミナルにリンクされたbash
インスタンス)に送信されます。ターミナルにbash
インスタンスが1つしかリンクされていない場合、そのインスタンスを強制終了すると、ターミナルは自動的に閉じます。複数のbash
インスタンスがターミナルにリンクされている場合、そのインスタンスを強制終了してもターミナルは自動的に閉じられません。
このスクリプトは端末を終了し、シェルと自分自身を終了します。
すべてのプロセスを容赦なく強制終了します。端末で複数のタブを開いている場合、これらのタブも閉じられます。
問題は、複数のターミナルが開かれ、これらがgnome-terminal-server
の子プロセスである場合、すべてのターミナルが強制終了されることです。
この場合、スクリプトは独立した端末で起動する必要があります。例:xterm
<your_command> & disown
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
PPID
PPIDは親プロセスID、この場合はシェル(e.g. /bin/bash
)です
PPPID
PPPIDはPPIDの親プロセスIDです。この場合、ターミナルウィンドウです。
<your_command> & disown
Bashシェルでは、disown builtinコマンドを使用して、ジョブテーブルからジョブを削除したり、親シェルがそれを受信した場合(ユーザーがログアウトした場合など)にSIGHUPシグナルが送信されないようにジョブをマークしたりします。
awk '{print $4}' "/proc/$PPID/stat"
ファイルの4番目の列の値を取得します/proc/$PPID/stat
(たとえば、/proc/1/stat
の場合は0を返します)
exec ./your-script
を使用できます。GNOMEターミナルのようなターミナルエミュレータは、その内部で実行されている初期プロセス(通常はシェル)が終了すると終了します。
すでに端末にいて、その端末を終了する前にしたいことが、特定のスクリプト(またはプログラム)を実行することだけである場合、これは、その端末で実行されているシェルがもう必要ないことを意味します。したがって、シェルのexec
ビルトインを使用して、シェルをコマンドで作成されたプロセスに置き換えます。
exec
なしでスクリプトを実行すると、secondシェルプロセスが作成される方法と同じです。構文はexec command
です(例:exec ./your-script
)。
exec
:例たとえば、count
というシェルスクリプトがあり、実行可能とマークされ、現在のディレクトリにあるとします。を含む:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
そして、ターミナルで、私は実行します:
exec ./count
これにより、数字5
、4
、3
、2
、および1
が1秒間に1つずつ出力され、ターミナルウィンドウが閉じます。
これを端末で最初に実行するプロセス以外から実行する場合-たとえば、最初にbash
を実行して別のシェルインスタンスを起動する場合-次に、作成したシェルに戻りますthatプロセス、端末を終了するのではなく。 (この警告はexit
ベースのメソッドにも同様に適用されます。)
./your-script; exit
を使用できます。シェルに(exec
を介して)新しいプロセスに置き換えるように指示したくない場合は、新しいプロセスが終了したらすぐに終了するように指示することができます。
これを行うには、コマンドとexit
コマンドを;
で区切って実行し、1行で指定できるようにします。
構文はcommand; exit
です(例:./your-script; exit
)。
command; exit
vs. command && exit
これは、 kos's および heemayl's の回答で提案されている./your-script&& exit
メソッドに似ていることに気付くかもしれません。違いは次のとおりです。
&&
は、最初のコマンド 成功したことが報告された の場合にのみ、2番目のコマンドを実行します。終了コード0を返します。;
は、最初のコマンドが成功を報告したかどうかに関係なく、2番目のコマンドを実行します。どちらを使用するかは、特定の状況によって異なります。コマンドが失敗した場合、呼び出し元のシェル(およびホスト端末)を起動したままにしますか?その場合は、&&
を使用します。そうでない場合は、;
を使用します。
command || exit
もあり、command
が報告された場合にのみ呼び出しシェルを終了しますfailure。
たとえば、スクリプトを実行する代わりに、ソースにすることができます
$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
タイトルの質問に明示的に回答するには、
「bashスクリプトの実行後にターミナルを終了する」:
スクリプトの詳細を確認することなく、シェルを起動せずに、オプション-e
(--command
)を使用して端末内でスクリプトを直接実行できます。シェルの代わりに使用されます。
gnome-terminal -e ./script.sh
スクリプトに引数を提供する場合は、オプション-x
(--execute
)を使用します。これにより、コマンドラインの残り全体がコマンドおよび引数として使用されます。
gnome-terminal -x ./script.sh foo bar
スクリプトが終了した場合、ユーザーの入力を待つことで何かを保持できる対話型のシェルはありません。
ターミナルは、実行中のコマンドが終了した後に終了します。次のように、sleep
が4秒実行された後、シェルなしで終了します。
gnome-terminal -x sleep 4
もちろん、スクリプトは別のシェルインスタンスを使用しているため、シェルスクリプトを引き続き使用できます。
また、明示的なスクリプトを使用してシェルを実行できます-インタラクティブではありません:
gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"
最も簡単な解決策は次のとおりです。
xdg-open file.pdf && exit
他の同様のコマンドとは異なり、Nohup
はSIGHUP
を無視するコマンドには必要ありません。xdg-open
である理由は、pdfファイルを開くのに適したアプリケーションである子プロセスの生成を終了します。端末から開始された実際のプロセスは強制終了されないため、Nohup
は不要です。
&&
は、前のコマンドが成功した場合に次のコマンドが実行されることを示します。つまり、終了コード0
($?=0
)を返し、exit
は単に端末を閉じます。
個人的には、サブシェルでpdfまたは他のファイルを開くコマンドを実行し、ファイルを開くのを遅らせてから終了します。基本的に、これは私がテストしたものです(Nohup gnome-open *.pdf &); sleep 2; exit
これのバリエーションはNohup gnome-open *.pdf && sleep 2 && exit
になります