&STDOUT")-6ren"> &STDOUT")-我在一个示例脚本中找到了这个,然后我从谷歌搜索并找到以下单词, Note that you cannot simply open STDERR to be a dup of STDOUT in you-6ren">
gpt4 book ai didi

perl - 打开的含义(STDERR, ">&STDOUT")

转载 作者:行者123 更新时间:2023-12-01 14:00:54 24 4
gpt4 key购买 nike

我在一个示例脚本中找到了这个,然后我从谷歌搜索并找到以下单词,

Note that you cannot simply open STDERR to be a dup of STDOUT in your Perl program and avoid calling the shell to do the redirection. This doesn't work:

open(STDERR, ">&STDOUT");

This fails because the open() makes STDERR go to where STDOUT was going at the time of the open(). The backticks then make STDOUT go to a string, but don't change STDERR (which still goes to the old STDOUT).

现在我很困惑。 open(STDERR, ">&STDOUT"); 的确切含义是什么?

最佳答案

& 调用中使用 & 模式

open STDERR, ">&STDOUT";  # or: open STDERR, ">&", \*STDOUT

第一个给定的文件句柄是第二个文件句柄的副本。参见 open ,并查看 man 2 dup2 因为这是通过 dup2 系统调用进行的。该符号遵循 shell 的 I/O redirection . 因为这里存在第一个文件句柄 (STDERR) 它首先被关闭。

效果是打印到 STDERR 将转到 STDOUT 在这完成之前要去的地方,具有原始 STDERR 的副作用> 正在关闭。

这是合法的,不会导致错误,但通常不是重定向 STDERR 的好方法 - 之后我们无法恢复 STDERR 任何更多。参见 open了解如何重定向 STDERR

评论的其余部分清楚地提到了反引号(参见 qx )的情况,它将执行命令的 STDOUT 重定向到程序,在 之后使用打开调用。这一切似乎指的是通过这种方式将STDERR重定向到STDOUT的想法。

唉,STDERR,由 open 调用转到 STDOUT 所在的位置,不会被反引号重定向,并且因此仍然“在那里”。在我的例子中,当我看到警告 (ls: cannot access...) 时,打印到 STDERR 的终端出现了

perl -we'open STDERR, ">&STDOUT"; $out = qx(ls no_such)'

(与 perl -we'$out = qx(ls no_such 2>&1)' 不同)。显式打印到 STDERR 也会作为 STDOUT 进入终端(添加此类打印并将输出重定向到文件以查看)。

这可能是预料之中的,因为 & 制作了一个文件句柄的副本,所以"new"文件句柄(以前的 STDERR)仍然有效STDOUT 的去向,即终端。在这种情况下当然是无意的,因此是一个错误。


UNIX 中的每个程序都连接到标准流 stdinstdoutstderr,带有文件描述符分别为 012。然后在 Perl 程序中,我们为这些准备好文件句柄,例如 STDERR(对于 fd 2)。

关于在 shell 中操作文件描述符的一些通常有用的帖子:

关于perl - 打开的含义(STDERR, ">&STDOUT"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56918957/

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