電子書籍の厳選無料作品が豊富!

みなさん、こんにちは。

Linuxのsh、bashのリダイレクトに関する質問です。

とあるサイトにて、下記のシェルスクリプトは何を表しているか?
という問題がありまして

# 【問題】ここから
#!/bin/sh
exec 3>&1
status=$({ { command1 3>&- 4>&-; echo $? 1>&4 3>&- 4>&-;} | command2 1>&3 3>&- 4>&-;} 4>&1)
if [ $status != 0 ]; then
...
fi
# 【問題】ここまで

問題の答え自体もよく分かっていないのですが、
その前に、「>&-」の部分が何を意図しているのかが理解できておりません。

「2>&1」で、標準エラー出力の出力先を、標準出力の出力先に切り替える。
という認識なのですが、「>&-」はどのような意味なのでしょうか。

どなたかご教示いただけないでしょうか。

A 回答 (1件)

>&- は出力ディスクリプタをクローズすると言うことです。

シェルのマニュアル( man bash 等 )に書いてあります。

この場合は、クローズしなくても特に動作には影響しないと思います。
(厳密にはcommand1やcommand2のプログラム次第ですが)

exec 3>&1
status=$({ { command1 ; echo $? 1>&4;} | command2 1>&3;} 4>&1)

で考えてみれば良いかと。これで難しければ、

status=$({ { command1 ; echo $? 1>&4;} | command2 1>/dev/tty ;} 4>&1)
    • good
    • 0
この回答へのお礼

返事が遅くなってしまいすみません。

>&- は、ディスクリプタのクローズを表しているのですね。
ご指摘のとおり、bashのマニュアルを解説しているサイトでも同様の記載を確認できました。

ありがとうございました。

お礼日時:2014/04/14 22:33

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