私はAdvaced Bash Guide、IOリダイレクションのこの例に従っています。これは 'stderrのみをパイプにリダイレクトする'を示しています。 fdを閉じるとき以外はどのように動作するのか理解していました。 最後のコマンドが終了したときに、各コマンドでfd 3を閉じる必要があるのはなぜですか?これらのファイル記述子の目的は何ですか?
exec 3>&1
ls -l 2>&1 >&3 3>&- | grep bad 3>&-
exec 3>&-
私はAdvaced Bash Guide、IOリダイレクションのこの例に従っています。これは 'stderrのみをパイプにリダイレクトする'を示しています。 fdを閉じるとき以外はどのように動作するのか理解していました。 最後のコマンドが終了したときに、各コマンドでfd 3を閉じる必要があるのはなぜですか?これらのファイル記述子の目的は何ですか?
exec 3>&1
ls -l 2>&1 >&3 3>&- | grep bad 3>&-
exec 3>&-
シェルでは、最初に1:ターミナル、2:ターミナルがあります。次に、1が複製されて3:端末となる。 lsが実行されると、ファイル記述子は継承されますが、パイプは最初のものに置き換えられ、1:pipe、2:terminal、3:terminal、リダイレクトはそれを1:端末、2:パイプ、(3:閉)にします。一方、grepはパイプに0を接続し、1:terminal、2:terminal、3:terminalを継承しますが、リダイレクトは1:terminal、2:terminal、(3:closed)になります。 最後に、シェルで3を閉じ、1:terminal、2:terminalの初期状態に戻ります。
ファイルディスクリプタは、プロセスがforkされたときに継承されますが、それ以降は独立しているため、各プロセスのディスクリプタ3を個別に閉じなければなりません。この場合、おそらくlsとgrepのために開いたままにすることには害はないでしょうが、整頓のためにはとにかく閉じています。
おかげさまで、深い説明をいただきありがとうございます。今、私は分かる。 – gamontbr