运行命令后
{ sleep 5; } &
Run Code Online (Sandbox Code Playgroud)
输出ps
是(输出1)
PID TTY TIME CMD
972 ttys000 0:00.27 -bash
2556 ttys000 0:00.00 -bash
2557 ttys000 0:00.00 sleep 5
Run Code Online (Sandbox Code Playgroud)
而对于
( sleep 5 ) &
Run Code Online (Sandbox Code Playgroud)
出ps
是(输出 2)
PID TTY TIME CMD
972 ttys000 0:00.28 -bash
2566 ttys000 0:00.00 sleep 5
Run Code Online (Sandbox Code Playgroud)
()
导致子shell环境,我希望在这种情况下为“输出1”,因为它会导致子进程分叉,而我希望{ sleep 5; } &
在当前shell中执行时为“输出2” 。这可能看起来是一个愚蠢的问题,但我真的不明白这种行为。
我在这里缺少什么?
AFAIK,cat
是一个外部命令,它在执行时分叉出一个新进程,就像sh -c
或执行脚本一样。话虽如此,我希望cat
使用它的命令环境,因为它被其他外部命令使用,比如
f=test.txt sh -c 'cat "$f"'
Run Code Online (Sandbox Code Playgroud)
这不应该显示文件的内容吗
f=test.txt cat $f
Run Code Online (Sandbox Code Playgroud)
?
注意:我不是在问什么是 someVariable=someValue command
. 我在问为什么第一个例子使用它的命令变量而不是第二个。变量扩展在第二个例子中发生的方式它应该在第一个例子中发生。