kzen.dev
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Rumesh
Rumesh
質問

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

gnome-openコマンドを使って特定のファイル(主にpdfファイル)を開くbash`スクリプトを書こうとしています。また、pdfファイルを開いたらターミナルを終了させたいと思っています。

スクリプトの最後に exit を追加してみましたが、ターミナルは閉じませんでした。私の質問に対する答えをオンラインで検索しようとしましたが、適切なものが見つかりませんでしたので、皆様のお力添えをいただければ幸いです。

全てのターミナルではなく、コマンドを実行したターミナルだけを殺すような回答が必要なのですが、可能でしょうか?私が受け入れた前の回答では、開いているすべてのターミナルウィンドウが殺されていました。今日までこのようなことがあるとは知りませんでした。

18 2015-04-20T13:28:14+00:00 3
 Rumesh
Rumesh
編集された質問 22日 4月 2015 в 6:55
Ubuntu
command-line
bash
scripts
この質問には 1 つの答え があり、読むには ログイン してください。
解決策・回答
 kos
kos
20日 4月 2015 в 3:37
2015-04-20T15:37:05+00:00
さらに
ソース
編集
#38383182

なぜなら、スクリプトは複数のコマンドを連続して実行するための簡単な方法であり、ここでは2つのコマンド(exitを含む)を実行するだけでよいからです。

もし、exit をコマンドの後や一連のコマンドの後に実行したい場合は、&& 演算子(前のコマンドや一連のコマンドが成功すると次のコマンドが実行される)や ; 演算子(前のコマンドや一連のコマンドが成功しても失敗しても次のコマンドが実行される)を使うことで、既に実行しているコマンドに連鎖させることができます。

この場合は次のようになります。

gnome-open <path_to_pdf_file> && exit

*<path_to_pfd_file> = pdfファイルのパス

スクリプトの最後に exit を書いても、スクリプトを実行した bash インスタンスを終了するだけなので、うまくいきません。bash インスタンスは、Terminal の内側の bash インスタンスとは別の bash インスタンスです。

スクリプトを使用したい場合、最も簡単な方法は、次のようにスクリプトを呼び出すことです。

<path_to_script> && exit

また、そのスクリプトが Terminal のカレントワーキングディレクトリにある場合は、次のようにします。

./<script> && exit

もし、どうしてもそうしたくない、できないという場合は、2番目に簡単な方法として、スクリプトの最後に次の行を追加することができます。

kill -9 $PPID

これにより、スクリプトの親プロセス(ターミナルにリンクされている bash インスタンス)に SIGKILL シグナルが送信されます。Terminalにリンクされているbashインスタンスが1つだけの場合は、それが殺されるとTerminal自体が終了します。複数の bash インスタンスが Terminal にリンクされている場合、そのインスタンスが殺されても、Terminal は自身を閉じることはありません。

 kos
kos
編集した答え 6日 5月 2015 в 9:13
12
0
 A.B.
A.B.
20日 4月 2015 в 1:45
2015-04-20T13:45:09+00:00
さらに
ソース
編集
#38383180

このスクリプトは、ターミナル、ひいてはシェルと自分自身を終了させます。

すべてのプロセスを容赦なく終了させます。ターミナルで複数のタブを開いている場合は、それらも閉じられます。

*問題は、複数のターミナルが開かれていて、それらが 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を使用して、ジョブテーブルからジョブを削除したり、親シェルがSIGHUPシグナルを受信した場合(ユーザーがログアウトした場合など)に、そのジョブにSIGHUPシグナルが送信されないようにマークしたりします。

  • awk '{print $4}' "/proc/$PPID/stat"

ファイル /proc/$PPID/stat の4列目の値を取得します(例:/proc/1/stat の場合は0を返します)。

 A.B.
A.B.
編集した答え 22日 4月 2015 в 7:30
5
0
 heemayl
heemayl
20日 4月 2015 в 4:07
2015-04-20T16:07:01+00:00
さらに
ソース
編集
#38383183

最もシンプルな解決策は

xdg-open file.pdf && exit

他の似たようなコマンドと違って、 nohup はコマンドが SIGHUP を無視するために必要ではありません。 理由は xdg-open が pdf ファイルを開くための優先アプリケーションである子プロセスを生成して終了するからです。ターミナルから起動された実際のプロセスはもはや殺されるべきものではないので、 nohup は必要ありません。

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

 heemayl
heemayl
編集した答え 20日 4月 2015 в 9:55
0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Ilya Smirnov
登録済み 6日前
2
Денис Васьков
登録済み 1週間前
3
Dima Patrushev
登録済み 1週間前
4
sirojidddin otaboyev
登録済み 2週間前
5
Елена Гайдамамакинат
登録済み 2週間前
ES
ID
JA
KO
RU
© kzen.dev :年
ソース
askubuntu.com
ライセンス cc by-sa 3.0 帰属