我是 shell 的新手,我刚刚了解到使用 (command) 会创建一个新的子 shell 并执行命令,所以我尝试打印父 shell 和子 shell 的 pid:
#!/bin/bash
echo $$
echo "`echo $$`"
sleep 4
var=$(echo $$;sleep 4)
echo $var
但答案是:
$./test.sh
9098
9098
9098
我的问题是:
- 为什么只有三个 echo 打印?我的代码中有 4 个 echo。
- 为什么三个 pid 相同? subshell 的 pid 显然和他父亲的不一样。
非常感谢您的回答:)
最佳答案
首先,分配捕获 child 的标准输出并将其放入var
,而不是打印它:
var=$(echo $$;sleep 4)
这可以通过以下方式看到:
$ xyzzy=$(echo hello)
$ echo $xyzzy
hello
其次,所有这些 $$
变量都在 current shell 中求值,这意味着它们在 任何子级之前被转换为当前 PID开始。 child 看到已经生成的 PID。换句话说, children 正在执行 echo 9098
而不是 echo $$
。
如果你想要子进程的 PID,你必须阻止在父进程中进行翻译,比如使用单引号:
bash -c 'echo $$'
关于linux - 关于 shell 和子 shell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10023666/