exec でコピーした fd をクローズする必要性
exec で、既存の fd をコピーすることがあります。具体的には、次のように
#!/bin/bash
echo hoge | {
exec 3<&0
echo fuga | {
from_stdin=$(cat)
from_3=$(cat <&3)
echo "From stdin: $from_stdin"
echo "From 3: $from_3"
}
exec 3<&-
}
2つの入力から読み込むようなシェルスクリプトを記述するときに、利用したりしています。
このように、 exec で fd をコピーした際には、基本的に最後にクローズするようにしています。上の例で言うと exec 3<&-
がそれです。
これは、なんとなく必要そうだから実行しているのですが、これが本当に必要だったのか、いまいち自信がないです。
質問:
- exec でコピーした fd は、これは必ず上記のようにクローズする必要がありますか?
- 必要がある場合、クローズしないと何が起きるのでしょうか。
- 必要がない場合、例えば上のケースではどうしてその必要がないのでしょうか。