ファイル記述子を閉じる、>&-、<&-

ファイル記述子を閉じる、>&-、<&-

私が読んでいるbashチュートリアルでは、読み取るためにファイル記述子を開くと、次のように言います。

exec 3< echolist

ではこうして閉じなければならないが、

exec 3<&-

ただし、書き込み用にファイル記述子を開いた場合は、次のように閉じる必要があります。

exec 3>&-

しかし、インターネットを見ると、人々は次のようにファイルを開いて閉じることを見ることができます。

exec 3>&- 

メモ:チュートリアルによると、いつ使用する必要がありますかexec 3<&1

exec n>&-だから私の質問は、nがファイルディスクリプタ番号である場所ですべてのファイルディスクリプタを閉じることは可能ですか?読み取り、書き込み、またはその両方が可能ですか?

答え1

<&-ファイル記述子を使用して閉じることができ、>&-両方bashの構文は同じように解析されます。

ファイルからy.tab.cbashソースコードから:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

答え2

私が知っている限り、exec 3>&-exec 3<&-は同じで、ファイルの開き方に関係なく、すべてのファイル記述子で使用できます。 POSIX定義のセクション2.7.6および2.7.5によるとシェルコマンド言語:

2.7.5 入力ファイル記述子のコピー

リダイレクト演算子:

[n] <&単語

[...切る...]

単語が「-」と評価されたら、ファイル記述子nまたは標準入力(nが指定されていない場合)を閉じる必要があります。開いていないファイル記述子を閉じようとすることは、エラーと見なすべきではありません。単語が異なると評価された場合、アクションは指定されません。

2.7.6 出力ファイル記述子のコピー

リダイレクト演算子:

[n]>単語(&W)

[...切る...]

単語が「-」と評価されると、ファイル記述子nまたは標準出力(nが指定されていない場合)が閉じます。開いていないファイル記述子を閉じようとすることは、エラーと見なすべきではありません。単語が異なると評価された場合、アクションは指定されません。

どちらのファイルも、ファイル記述子 n が最初に開く方法については何も指定しません。これは次の事実と一致します。閉じる(2)ファイルをどのように開くかは関係ありません。

次をすばやく追跡します。

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

これとは対照的に:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

どちらの場合も、Bashがまったく同じことをすることを示してください。

やや興味深い事実2つ

答え3

cuonglmは '<>' FDを閉じる例を理解しています。

これは高度なBashスクリプトガイドで引用されました。http://tldp.org/LDP/abs/html/io-redirection.html

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.

関連情報