Bash:重定向文件描述符

Dr.*_*ogy 4 bash redirect file-descriptor

我希望有人可以解释一个现象.正如标题所示,我正在学习文件描述符的重定向.在此过程中,我遇到了一个关于重定向符号使用的问题,特别是在设置永久重定向时.我注意到在某些情况下,我是否使用<或似乎并不重要>.例如,使用以下脚本:

#!/bin/bash

#Setting file descriptor 3 to redirect  to STDIN
exec 3<&0

#Setting STDIN to read from input file
exec 0<inputFile


while read var
do
    echo "$var"

done

#Setting STDIN to read from file descriptor 3 which is redirected to the default STDIN
exec 0<&3

read -p "Enter a word:" word

echo "$word"
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,如果我使用><在陈述exec 3<&0或中,似乎并不重要exec 0<&3.在这些陈述中的任何一个中,似乎如果我换出重定向符号,我仍然得到完全相同的结果.对我来说,对行进行相同类型的更改似乎很明显:

exec 0<inputFile
Run Code Online (Sandbox Code Playgroud)

exec 0>inputFile
Run Code Online (Sandbox Code Playgroud)

不会产生相同的结果,因为将STDIN重定向到文件与将文件重定向到STDIN不同.

所以我的问题是:

  1. <vs >:

    # Why aren't there any differences between these two statements?
    exec 3<&0
    exec 3>&0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 3<&0vs 0<&3:

    # Why is there a difference between these two statements?
    exec 3<&0
    exec 0<&3
    
    Run Code Online (Sandbox Code Playgroud)

这种类型的重定向对我来说足够困难,我可以在没有这些类型不一致的情况下保持头脑并保持直线.任何解释将不胜感激.

gni*_*urf 5

复制文件描述符时,dup2无论是否使用<或调用都无关紧要>.

关闭文件描述符时也会出现同样的情况.你可以使用n>&-n<&-.


然而为什么那0<&3不是一回事3<&0呢?

这在dup2我链接的规范中有所解释:

int dup2(int fildes, int fildes2);
Run Code Online (Sandbox Code Playgroud)

如果出现以下情况,dup2()函数将失败:

[EBADF]

菲尔德斯参数不是有效的打开文件描述符或参数fildes2为负或大于或等于{} OPEN_MAX.

在这种情况下exec 0<&3,Bash调用dup2(3,0)并确实收到EBADF错误(因为我们的情况是fildes = 3,那时当时不是有效的打开文件描述符).您可以通过以下方式轻松检查strace:

$ strace -e dup2 bash -c 'exec 0>&3'
dup2(3, 0)                              = -1 EBADF (Bad file descriptor)
bash: 3: Bad file descriptor
dup2(10, 0)                             = 0
+++ exited with 1 +++
Run Code Online (Sandbox Code Playgroud)