- ベストアンサー
シェルスクリプトを実行後すぐに中断する方法
シェルスクリプトがどのシェル(bash, zsh, tcsh)で実行されたかを確認したいため実行直後に停止したいのですが、どうすればよいでしょうか? すかさずctrl+zを押しても間に合いません。 (一般的な方法を知りたいのでスクリプト内でwaitというのは無しでお願いします。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>(一般的な方法を知りたいのでスクリプト内でwaitというのは無しでお願いします。) 一般的な方法としてはスクリプトの1行目を見ます。 #!/bin/zsh 等。 1行目が#!で始まらない場合は、そのスクリプトを実行するシェルの機能に依存します。Linuxだと一般的にはbashからの起動となるので、その場合、スクリプトもbashで実行されます。
その他の回答 (2)
- saijyo_739
- ベストアンサー率53% (119/222)
確実に間に合う方法ってないと思います。 csh系のシェルにはstopコマンドがあるのでなど、個別には可能と なる場合もありますが。 確認するなら、スクリプト内部で認識すれば良いのではないかな。 ※ 表示する・表示しないは別にして(ログファイルを作り記録など)。 Ctrl+z同様、間に合わないかも知れなくて良いならそのシェルに SIGNALを送ると止めれますが(killコマンド使って停止や再開シグナル を送る) Ctrl+zを押すのもkillコマンド使ってシグナルを送る事を行っている だけでしょうし、fgやbgでの再開も再開シグナルなどのシグナルを 送っているだけでしょうし。 最初にインタプリタ行を確認とありましたが、bash scriptや sh scriptでどちらのシェルでも動くように書かれたスクリプト を実行した場合にはインタプリタ行の記述とは異なる場合も ありますし。 大抵のシェルで$$が自プロセスのpidになっているでしょうから $$のプロセステーブルを見てそれがシェルなら(sourceコマンドや . コマンドで読込み実行されている場合)そのshell、違う場合には 親プロセスのシェルをというのが手順かな。 プロセステーブルの更新タイミングの問題もあるのでpsコマンドで 単純に取得できるかというとやってみないと分からない面があります ので、その辺りの同期をとってやる必要がでてくる事も考えられ ますね。 『一般的な方法を知りたいのでスクリプト内でwaitというのは無し』 との事ですが、waitコマンドはshにもcshにも組み込まれている内部 コマンドですので十分一般的な方法だと思いますよ。
- xkuonx
- ベストアンサー率41% (23/56)
求めている回答とは違うとは思いますが… シェルスクリプトって一番上に #!/bin/bash みたいなの書きませんでしたっけ? #!/bin/bash なら、bashが動いてると思いますが、違いますかね?