shell – 间接的Solaris 10 / bin / sh forks

我注意到Solaris 10的Bourne
shell,/ bin / sh(以及/ sbin / sh)在使用间接(<)时会分支子shell.我尝试了一堆其他Bourne-ish炮弹,包括:

> Solaris 10上的POSIX /usr/xpg4 / bin / sh shell

Solaris 10上的/ bin / bash,/ bin / ksh

> AIX 5上的/ bin / sh

> / bin / sh在Debian
Linux 5上

并且这些都没有表现出这种行为.

我很惊讶我之前没有被这个咬过.例如,在saner shell(即上面列出的所有内容)中,以下脚本输出“1”:

$cat foo
#!/bin/sh
x=0
while read y ; do
  x=1
done </etc/passwd
echo $x
$./foo
0
$

Solaris 10的/ bin / sh返回0,因为赋值x = 1发生在由间接引起的子shell中:当子shell退出时,该赋值将丢失. (如果我删除< / etc / passwd并从stdin读取,则输出“1”,如预期的那样). 是否有一些古老的原因,“传统的”Solaris sh有这个属性?或者这是一个错误?

最佳答案 我会说这违反了POSIX标准.

Command substitution, commands that are grouped with parentheses, and asynchronous lists shall be executed in a subshell environment. Additionally, each command of a multi-command pipeline is in a subshell environment; as an extension, however, any or all commands in a pipeline may be executed in the current environment. All other commands shall be executed in the current shell environment.

资料来源:Shell Command Language,第2.12节.

点赞