gpt4 book ai didi

bash - 重定向和进程替换的顺序

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

重定向和进程替换的进程顺序是什么?处理预错误的一行命令可以正常工作。

{ echo hello;jiji jio; } 2> >(while read line;do echo "____$line";done) >right.log

虽然这个顺序没有。

{ echo hello;jiji jio; } >right.log 2> >(while read line;do echo "____$line";done)

最佳答案

重定向是从左到右处理的。这肯定是 Posix 所说的:(接近 the prologue to section 2.7 的结尾)

If more than one redirection operator is specified with a command, the order of evaluation is from beginning to end.

bash 手册 (v5.1) 同意:

Redirections are processed in the order they appear, from left to right. (Section 3.6)

所以在第一种情况下,当>(...)子进程被创建时,stdout还没有被重定向,所以原始的stdout被子进程继承,这就是它发送其输出(它从 {...} 的标准错误中读取的行)。

在第二种情况下,stdout 在创建子进程之前被重定向到 right.log,因此这是子进程继承的作为其 stdout 的内容,因此它将在其中回显其输入。因此,right.log 以主进程回显的行和重定向到子进程的错误结束,然后用前导下划线回显。

这似乎是 bash 4.4 和 bash 5.0 的行为,它们是我手边的。

但是请注意,即使管道运算符更靠右,重定向到管道之前也会发生在命令中的任何重定向:

The standard input, standard output, or both of a command shall be considered to be assigned by the pipeline before any redirection specified by redirection operators that are part of the command. (Posix section 2.9.2).

这似乎与这个问题无关,但了解它可能会有用。

关于bash - 重定向和进程替换的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72158139/

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