web-dev-qa-db-ja.com

bashスクリプトの実行後にターミナルを終了します

gnome-openコマンドを使用して、特定のファイル(主にpdfファイル)を開くbashスクリプトを作成しようとしています。また、pdfファイルを開いたら、端末を終了させます。

スクリプトの最後にexitを追加しようとしましたが、端末を閉じません。私は私の質問への答えをオンラインで検索しようとしましたが、適切なものを見つけることができませんでした。

すべての端末ではなく、コマンドを実行した端末を強制終了するだけの回答が必要ですか?私が受け入れた以前の回答は、開いているすべてのターミナルウィンドウを強制終了します。今日までこれが事実だとは思いませんでした。

17
Rumesh

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インスタンスがターミナルにリンクされている場合、そのインスタンスを強制終了してもターミナルは自動的に閉じられません。

12
kos

このスクリプトは端末を終了し、シェルと自分自身を終了します。

すべてのプロセスを容赦なく強制終了します。端末で複数のタブを開いている場合、これらのタブも閉じられます。

問題は、複数のターミナルが開かれ、これらが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を返します)

5
A.B.

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

これにより、数字5432、および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

4
Eliah Kagan

たとえば、スクリプトを実行する代わりに、ソースにすることができます

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
2
RiaD

タイトルの質問に明示的に回答するには、

「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"
0
Volker Siegel

最も簡単な解決策は次のとおりです。

xdg-open file.pdf && exit

他の同様のコマンドとは異なり、NohupSIGHUPを無視するコマンドには必要ありません。xdg-openである理由は、pdfファイルを開くのに適したアプリケーションである子プロセスの生成を終了します。端末から開始された実際のプロセスは強制終了されないため、Nohupは不要です。

&&は、前のコマンドが成功した場合に次のコマンドが実行されることを示します。つまり、終了コード0$?=0)を返し、exitは単に端末を閉じます。

0
heemayl

個人的には、サブシェルでpdfまたは他のファイルを開くコマンドを実行し、ファイルを開くのを遅らせてから終了します。基本的に、これは私がテストしたものです(Nohup gnome-open *.pdf &); sleep 2; exit

これのバリエーションはNohup gnome-open *.pdf && sleep 2 && exitになります

0