Bash:重定向文件描述符



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

#!/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"

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

exec 0<inputFile

与。

exec 0>inputFile

不会产生相同的结果,因为将 STDIN 重定向到文件与将文件重定向到 STDIN 不是一回事。

所以我的问题是:

  1. <>

    # Why aren't there any differences between these two statements?
    exec 3<&0
    exec 3>&0
    
  2. 3<&0vs0<&3

    # Why is there a difference between these two statements?
    exec 3<&0
    exec 0<&3
    

这种类型的重定向对我来说已经足够困难了,让我无法在没有这些类型不一致的情况下保持笔直。任何解释将不胜感激。

复制文件描述符时,不管调用dup2,不管你使用<还是>

关闭文件描述符时也会发生同样的情况。您可以使用n>&-n<&-


但是,为什么0<&33<&0不是一回事呢?

这在我链接的dup2规范中进行了解释:

int dup2(int fildes, int fildes2);

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

[EBADF]

fildes参数不是有效的打开文件描述符,或者参数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 +++

相关内容

  • 没有找到相关文章

最新更新