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 は、これは必ず上記のようにクローズする必要がありますか?
    • 必要がある場合、クローズしないと何が起きるのでしょうか。
    • 必要がない場合、例えば上のケースではどうしてその必要がないのでしょうか。