こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Bシェルでパイプ→exitがうまくいかない

Bシェルで、下記のようにパイプの中でexitすることでスクリプトを終了させようとしたのですが、パイプした処理を抜けるだけexit 1 のところでスクリプトが終了せず、whileループの後のexit 0のところまで行ってスクリプトが終了しました。

パイプの中でexitすると、パイプの外に出るだけになるのでしょうか?
どうすれば、パイプの中でスクリプトを終了させることができるのでしょうか?

#! /bin/sh

cat /tmp/tmp.dat |
while read LINE
do
LL=LINE
exit 1
done

echo $LINE

exit 0


また、これとは別に、変数LLに$LINEを代入して、その後LLをechoすると、$LINEの内容が出ると思ったら、中が空になっているようで何も出力されませんでした。
これを回避して、LLにLINEの内容を保存するような処理をしたいのですが、どうすればいいでしょうか?

以上、よろしくお願いします。

投稿日時 - 2006-08-20 23:46:42

QNo.2351934

暇なときに回答ください

質問者が選んだベストアンサー

Solaris の /bin/sh では、
入力をリダイレクトしたコマンド実行でも
子プロセスを生成します。
これを回避するには exec コマンドを使用します。

exec 0<filename
while read var; do
 :
 :
done

投稿日時 - 2006-08-22 18:22:12

お礼

回答ありがとうございます。
あいにく手元にsolarisの実行環境がないのですが、
環境が整い次第試してみます。

投稿日時 - 2006-08-22 21:56:08

ANo.4

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

本質的ではないですが、
LL=LINE
ではなくて、
LL="$LINE"
ですね。

投稿日時 - 2006-08-21 23:51:13

補足

そうですね、ありがとうございます。

投稿日時 - 2006-08-22 21:54:02

ANo.2

>done < /tmp/tmp.dat
>の形でもやってみましたが、exitできず、whileループを抜けるだけの形になってしまいました。

どういうスクリプトになったのですか?

No.1の方が書かれたスクリプトのwhileループ内のbreakをexitに変えればご希望の動作になると思うのですが。

-------8<-------8<-------8<-------8<-------
$ cat test.sh
#! /bin/sh

while read LINE
do

LL=LINE
exit 1

done < /tmp/tmp.dat

echo $LINE
exit 0
$ ./test.sh
$ echo $?
1
$ sh -x ./test.sh
+ read LINE
+ LL=LINE
+ exit 1
-------8<-------8<-------8<-------8<-------

投稿日時 - 2006-08-21 23:32:01

補足

回答ありがとうござます。
そのように記述したスクリプトを実行したのですが、
exitでスクリプトが終了せず、breakと同じような動作をしました。
回答に貼り付けていただいた実行結果はどのような環境で実行されたのでしょうか?

投稿日時 - 2006-08-22 21:52:24

ANo.1

パイプは別プロセスを作ることで実現されていますから、そういう仕様です。
質問文のスクリプトの場合はパイプを使う必然性はないので、使わなければ済むと思いますよ。

#! /bin/sh

while read LINE
do
LL=LINE
break
done < /tmp/tmp.dat
echo $LINE
exit 0

投稿日時 - 2006-08-21 10:31:23

補足

回答ありがとうございます。
ご教示いただいた
done < /tmp/tmp.dat
の形でもやってみましたが、exitできず、whileループを抜けるだけの形になってしまいました。

投稿日時 - 2006-08-21 20:41:00

あなたにオススメの質問