echo >>regular_file と echo >>&fd: 一方は閉じており、もう一方は閉じていません。

echo >>regular_file と echo >>&fd: 一方は閉じており、もう一方は閉じていません。

私の観察によると、通常のファイルにエコーするとファイルが開き、echo >>regular_fileファイルに追加され、ファイルが閉じられます。そして、開いているファイル記述子echo >>&fd*にエコーすると、ファイルは閉じられません。この動作はbash / zshマニュアルに文書化されていますか?

*ここで、fdはと同じ数字にすることができます3

答え1

構文はecho >>&fdPOSIX、Bashまたはzshによって定義されていませんecho >&fd。これは両方のジョブがファイル記述子のコピーに関連していますが、最初のジョブには指定されたファイルを最初に開くジョブが含まれます。 (fdが標準出力echo >>regular_fileと同じ)シェルで最初にsを実行すると、この操作はファイル記述子を返し、返されたfdを標準出力fdに接続して電子を閉じます。コマンドの実行が完了すると、fdは「復元されます」(aが作成された場合は必ずしも完了する必要はありませんが、完了方法に関係なく、fdはコマンドが実行される前に参照されていたのと同じファイルを参照します)。echo 1>>regular_file1openregular_filedup11fork1

2番目のコマンドecho >&fd(やはりecho 1>&fd)はfdstdoutにのみコピーされます閉じないfd。再度コマンドを実行した後、標準出力を復元します。

POSIXシェルコマンド言語および他のシェルに文書化されているように、最初の操作をリダイレクトと呼び、2番目の操作をファイル記述子のコピーと呼ぶ方がはっきりします。

関連情報