exec
が現在のシェルでI/Oリダイレクトを実行できることを理解していますが、次のような使用法しか表示されません。
exec 6<&0 # Link file descriptor #6 with stdin.
# Saves stdin.
exec 6>&1 # Link file descriptor #6 with stdout.
# Saves stdout.
それから私はそれを理解しています<
は入力ストリーム用、>
は出力ストリーム用です。だから何をexec 3<&1
行う?
PS:私はこれを Batsソースコード から見つけました
bash manpage
から:
Duplicating File Descriptors
The redirection operator
[n]<&Word
is used to duplicate input file descriptors. If Word expands to one or
more digits, the file descriptor denoted by n is made to be a copy of
that file descriptor. If the digits in Word do not specify a file
descriptor open for input, a redirection error occurs. If Word evalu‐
ates to -, file descriptor n is closed. If n is not specified, the
standard input (file descriptor 0) is used.
The operator
[n]>&Word
is used similarly to duplicate output file descriptors. If n is not
specified, the standard output (file descriptor 1) is used. If the
digits in Word do not specify a file descriptor open for output, a re‐
direction error occurs. As a special case, if n is omitted, and Word
does not expand to one or more digits, the standard output and standard
error are redirected as described previously.
strace
でいくつかのデバッグを行いました:
Sudo strace -f -s 200 -e trace=dup2 bash redirect.sh
3<&1
の場合:
dup2(3, 255) = 255
dup2(1, 3) = 3
3>&1
の場合:
dup2(1, 3) = 3
2>&1
の場合:
dup2(1, 2) = 2
3<&1
は3>&1
とまったく同じように動作し、stdoutをファイル記述子3に複製しているようです。