这两者有什么区别:
cnt=1
head -n $((++cnt)) /etc/passwd >/dev/null
echo $cnt # prints 2
Run Code Online (Sandbox Code Playgroud)
和
cnt=1
date >$((++cnt)).txt # creates file "2.txt"
echo $cnt # prints 1
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么在第二个示例中打印 1。笔记:
cnt=1
(cnt=5)
echo $cnt # prints 1
Run Code Online (Sandbox Code Playgroud)
我知道为什么这会打印 1。重定向是否也在子 shell 中执行?如果是,在哪里描述的?
我没有具体引用为什么这种行为存在,但在SC2257中记录下来手册中有一些有趣的要点需要注意。
\n\n\n当要执行除内置或 shell 函数之外的简单命令时,会在单独的执行环境中调用
\n
\n \xc2\xa73.7.3 命令执行环境
这反映了 SC2257 所指出的内容,尽管不清楚重定向的值是在哪个环境中评估的。但是\xc2\xa73.1.1 Shell 操作似乎说重定向发生在在调用此执行(子)环境
\n\n\n基本上,shell 执行以下操作:
\n
\n...\n
\n- 执行各种 shell 扩展......
\n- 执行任何必要的重定向并从参数列表中删除重定向运算符及其操作数。
\n- 执行命令。
\n
我们可以看到,这不仅限于算术扩展,还包括其他状态更改扩展,例如:=:
$ bash -c \'date >"${word:=wow}.txt"; echo "word=${word}"\'\nword=\n\n$ bash -c \'echo >"${word:=wow}.txt"; echo "word=${word}"\'\nword=wow\nRun Code Online (Sandbox Code Playgroud)\n有趣的是,这似乎不是一个(明确定义的)子 shell 环境,因为BASH_SUBSHELL仍然设置为0:
$ date >"${word:=$BASH_SUBSHELL}.txt"; ls\n0.txt\nRun Code Online (Sandbox Code Playgroud)\n我们还可以检查其他一些 shell,并看到它们zsh具有相同的行为,但dash并非如此:
$ zsh -c \'date >"${word:=wow}.txt"; echo "word=${word}"\'\nword=\n\n$ zsh -c \'echo >"${word:=wow}.txt"; echo "word=${word}"\'\nword=wow\n\n$ dash -c \'date >"${word:=wow}.txt"; echo "word=${word}"\'\nword=wow\n\n$ dash -c \'echo >"${word:=wow}.txt"; echo "word=${word}"\'\nword=wow\nRun Code Online (Sandbox Code Playgroud)\n我浏览了该zsh指南,但也没有找到对此行为的确切提及。
不用说,这似乎不是有详细记录的行为,因此幸运的是 ShellCheck 可以帮助捕获它。然而,它似乎是长期存在的行为,它可以在 Bash 3、4 和 5 中重现。
\n* 不幸的是,添加 SC2257 的提交没有链接到问题或任何其他进一步的上下文。
\n| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |