是否保证 POSIX shell 在管道中执行任何命令之前总是打开文件进行重定向?

Is it guaranteed that POSIX shell always open files for redirection before executing any commands in pipeline?

例如,考虑在空目录中调用此 shell 命令:

ls | cat | cat | cat > file; cat file

我实际测试的时候,结果总是:

file

但是 POSIX 可以保证这种行为吗?我从 opengroup POSIX 标准页面阅读了第 2.7 节重定向和 2.9.2 管道,但我找不到任何关于此的内容。

有一个说法似乎相关,但我无法真正理解它的含义,因为我不是以英语为母语的用户。声明是这样的:

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 (see 
Redirection).

不,不是。

管道组件被扩展、重定向和并行执行。在您的示例中,ls 可能会超过 cat > file 并在创建 file 之前检索文件列表,反之亦然。你不能指望 cat > file 每次都赢 the race

为了确保重定向在管道的任何组件执行之前执行,您需要将管道用大括号括起来,并将重定向移到外面:

{ ls | cat | cat | cat; } > file
cat file