关于shell和subshel​​l

时间:2012-04-05 06:29:07

标签: linux bash shell

我是shell的新手,我刚刚了解到use(命令)会创建一个新的子shell并执行命令,所以我尝试打印父shell和子shell的pid:

#!/bin/bash

echo $$
echo "`echo $$`"
sleep 4
var=$(echo $$;sleep 4)
echo $var

但答案是:

$./test.sh
9098
9098
9098

我的问题是:

  1. 为什么只有三个回声打印?我的代码中有4个回声。
  2. 为什么三个pid是一样的? subshel​​l的pid显然与他父亲的pid不一样。
  3. 非常感谢您的回答:)

3 个答案:

答案 0 :(得分:6)

首先,分配捕获子项的标准输出并将其放入var,而不是打印它:

var=$(echo $$;sleep 4)

可以看到:

$ xyzzy=$(echo hello)
$ echo $xyzzy
hello

其次,所有这些$$变量都在当前 shell中进行评估,这意味着在任何子项启动之前它们都会变为当前的PID 。孩子们看到已经生成的PID。换句话说,孩子们正在执行echo 9098而不是echo $$

如果您想要孩子的PID,您必须阻止父母的翻译,例如使用单引号:

bash -c 'echo $$'

答案 1 :(得分:0)

echo "one.sh $$"
echo `eval echo '$$'`

我期待上面打印不同的pids,但事实并非如此。它正在创建一个子进程。通过在``中添加sleep来验证。

echo "one.sh $$"
echo `eval "echo '$$'";sleep 10`

从脚本执行上述操作并运行 ps 时,会显示两个进程one.sh(脚本名称)和sleep。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
test    12685  0.0  0.0   8720  1012 pts/15   S+   13:50   0:00      \_ bash one.sh
test    12686  0.0  0.0   8720   604 pts/15   S+   13:50   0:00          \_ bash one.sh
test    12687  0.0  0.0   3804   452 pts/15   S+   13:50   0:00              \_ sleep 10

这是产生的输出

one.sh 12685
12685

不确定我错过了什么。

答案 2 :(得分:-1)

解决方案是$!。如:

#!/bin/bash

echo "parent" $$
yes > /dev/null &
echo "child" $!

输出:

$ ./prueba.sh
parent 30207
child 30209