アプリ版:「スタンプのみでお礼する」機能のリリースについて

#!/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が出力されて次にプロンプトが出てきて欲しい。。

散漫な文章でポイントがつかみにくいのですが、わかる方がいましたら教えていただきたいです。。

A 回答 (1件)

前にも書きましたが


https://oshiete.goo.ne.jp/qa/10065593.html
> シェルでコマンドを実行するときには、
> まず、シェルが * だの $ だのの展開や、 引用符による処理をします。
> その結果を実行コマンドとして実行します。

kill -2 $$ は「現在実行中のプロセスにシグナル2を送るおまじない」ではなく、
あくまで「指定したプロセスにシグナルを送る」コマンドです。
この時点での $$ が展開された「kill -2 ($$が展開されたもの)」を実行するものです。
$$ は、現在実行中のシェルのプロセスIDに展開される、ということから考えれば、kill -2 の送り先がどこだかわかるでしょう。

また、「展開された後で実行される」ということを考えれば、 ( sleep 10; kill -2 $$) を実行した時点で、影も形もない readコマンドのプロセスIDなど知りようがない、ということからも、readに送られるものではない、ということが明白です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうでした......アホですみません。
ただ、もう少し付き合っていただきたいのですが、

このシェルスクリプトを実行した際、バックグラウンド処理が機能していないせいか、readによる入力待ちが発生(10秒たっても入力待ち)したままになるのですが、これはこういうものなのでしょうか?

なにか自分が悪いのでしょうか?それともシステムに問題があって思うような形にならないのでしょうか?

自分としては、readによる入力待ちを放置していたらgood byeが表示されてほしいのですが....

お礼日時:2017/11/24 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!