gpt4 book ai didi

Bash:重定向文件描述符

转载 作者:行者123 更新时间:2023-11-29 09:11:45 25 4
gpt4 key购买 nike

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

#!/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<&0对比0<&3 :

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

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

最佳答案

复制 文件描述符时,没关系, dup2 被调用,不管你是否使用<> .

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


However why then is 0<&3 not the same thing as 3<&0?

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

int dup2(int fildes, int fildes2);

The dup2() function shall fail if:

[EBADF]

The fildes argument is not a valid open file descriptor or the argument fildes2 is negative or greater than or equal to {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 +++

关于Bash:重定向文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com