是否保证 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
例如,考虑在空目录中调用此 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