dポイントプレゼントキャンペーン実施中!

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の内容を保存するような処理をしたいのですが、どうすればいいでしょうか?

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

A 回答 (4件)

Solaris の /bin/sh では、


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

exec 0<filename
while read var; do
 :
 :
done
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/22 21:56

本質的ではないですが、


LL=LINE
ではなくて、
LL="$LINE"
ですね。

この回答への補足

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

補足日時:2006/08/22 21:54
    • good
    • 0

>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<-------

この回答への補足

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

補足日時:2006/08/22 21:52
    • good
    • 0

パイプは別プロセスを作ることで実現されていますから、そういう仕様です。


質問文のスクリプトの場合はパイプを使う必然性はないので、使わなければ済むと思いますよ。

#! /bin/sh

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

この回答への補足

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

補足日時:2006/08/21 20:41
    • good
    • 0

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