#!/bin/sh
trap ":" 2
( sleep 10; kill -2 $$) &
echo -n "hello "
read ANSWER #ココです
if kill -0 $! 2>/dev/null; then
kill $!
case "$ANSWER" in
hello ) echo "hello" ;;
* ) echo "good bye" ;;
esac
trap2
このシェルスクリプトを実行してreadコマンドによるプロンプトが出ていている状態で放置した場合、バックグラウンド処理による割り込みが入ると思うのですが、kill -2 $$でプロセスが終了させられるのはreadのなのでしょうか?
このtrapのシグナルの処理の使い方は、プロセスが中断させられるのを防ぐためにあると理解したのですが、kill -2 $$で処理が終了されてしまうのは、このシェルスクリプト自体なのでしょうか?割り込みが入っても、その割り込みは途中まで実行していたコマンドに適用されるのでしょうか?
自分の環境で実行したら、ずっと入力を受け付けている状態で、何も入力しなければそのままその状態です。
バッググラウンド処理が実行されて、このシェルスクリプト自体が途中で終了して次のプロンプト($
)、このシェルスクリプトは実行され放置されていたが、readに割り込み処理が適用され、ifからまた処理が始まり、最後まで実行され次のプロンプト(good byeが表示され、普通のプロンプト$ )。
バックグランドのkillにより、readに割り込み処理(kill -2 ~です)が適用され、readによる処理が飛ばされ、途中からifから処理が再開されるのなら、なぜ自分の環境では処理が再開されたようには見えないのでしょうか?(自分としては、放置していた場合caseのところにある"good bye"が表示されてほしい)
放置されいた場合、good byeが出力されて次にプロンプトが出てきて欲しい。。
散漫な文章でポイントがつかみにくいのですが、わかる方がいましたら教えていただきたいです。。
No.1ベストアンサー
- 回答日時:
前にも書きましたが
https://oshiete.goo.ne.jp/qa/10065593.html
> シェルでコマンドを実行するときには、
> まず、シェルが * だの $ だのの展開や、 引用符による処理をします。
> その結果を実行コマンドとして実行します。
kill -2 $$ は「現在実行中のプロセスにシグナル2を送るおまじない」ではなく、
あくまで「指定したプロセスにシグナルを送る」コマンドです。
この時点での $$ が展開された「kill -2 ($$が展開されたもの)」を実行するものです。
$$ は、現在実行中のシェルのプロセスIDに展開される、ということから考えれば、kill -2 の送り先がどこだかわかるでしょう。
また、「展開された後で実行される」ということを考えれば、 ( sleep 10; kill -2 $$) を実行した時点で、影も形もない readコマンドのプロセスIDなど知りようがない、ということからも、readに送られるものではない、ということが明白です。
ありがとうございます。
そうでした......アホですみません。
ただ、もう少し付き合っていただきたいのですが、
このシェルスクリプトを実行した際、バックグラウンド処理が機能していないせいか、readによる入力待ちが発生(10秒たっても入力待ち)したままになるのですが、これはこういうものなのでしょうか?
なにか自分が悪いのでしょうか?それともシステムに問題があって思うような形にならないのでしょうか?
自分としては、readによる入力待ちを放置していたらgood byeが表示されてほしいのですが....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 世界情勢 日本も中国から輸入する海産物の総てについて、放射線の全量調査を実施すべき? 6 2023/07/20 21:08
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- PostgreSQL postgreSQLをbashで実行する際に「MORE」表示をなくす方法 1 2023/05/08 21:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
Excel(エクセル) VBA プロシー...
-
Powershellとコマンドプロンプト
-
大至急お願いします。Pythonの...
-
バッチファイルでクリップボー...
-
Windows の時刻同期間隔
-
ASP.NET、GridViewコントロール...
-
VB.NETでのDOSコマンドを実行に...
-
vbscriptを用いて他のVBSファイ...
-
シェルからCで作った実行ファイ...
-
Windows System32 Security Hea...
-
バッチファイルが不正終了して...
-
エクセル 起動時にマクロ実行
-
EXIF情報を出力するマクロ
-
VBAでバッチファイルを1つ実行...
-
PDFファイルを開き、印刷し、閉...
-
VBscriptが起動しない?
-
VBAを時間指定で自動実行
-
Accessからバッチ処理を実施し...
-
Excel VBAで複数のバッチファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
「読み取りと実行」と「読み取...
-
exeファイルを実行するとコマン...
-
VBscriptが起動しない?
-
バッチファイルの内容を表示さ...
-
Excel VBA ステップインが途中...
-
エクセル フォルダの画像を画...
-
バッチファイルが不正終了して...
-
PDFファイルを開き、印刷し、閉...
-
複数のbatファイルを自動実行し...
-
[teraterm] waitコマンドで停止...
-
VBScriptでコマンドプロンプト...
-
ネットワーク名が見つかりません
-
Excel(エクセル) VBA プロシー...
-
Access の VBA 実行中に他の操...
-
VB.NETでのDOSコマンドを実行に...
-
Excelのセルの内容をコマンドプ...
-
VBS実行時にコマンドプロンプト...
-
VBA 既に開いているBookに継続...
-
メッセージを他のPCに出したい
おすすめ情報