• ベストアンサー

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

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

  • ベストアンサー
  • zsh
  • ベストアンサー率68% (11/16)
回答No.4

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

abspectra
質問者

お礼

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

その他の回答 (3)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

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

abspectra
質問者

補足

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

  • Lean
  • ベストアンサー率72% (435/603)
回答No.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<-------

abspectra
質問者

補足

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

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

パイプは別プロセスを作ることで実現されていますから、そういう仕様です。 質問文のスクリプトの場合はパイプを使う必然性はないので、使わなければ済むと思いますよ。 #! /bin/sh while read LINE do LL=LINE break done < /tmp/tmp.dat echo $LINE exit 0

abspectra
質問者

補足

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