关于shell和subshel​​l

我是shell的新手,我刚刚知道use(command)会创build一个新的子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是一样的? 子壳的pid显然与父亲不一样。

非常感谢答案:)

首先,作业捕获孩子的标准输出并将其放入var ,而不是打印出来:

 var=$(echo $$;sleep 4) 

这可以看出:

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

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

如果你想要孩子的PID,你必须防止在父母的翻译,如通过使用单引号:

 bash -c 'echo $$' 
 echo "one.sh $$" echo `eval echo '$$'` 

我期待上面打印不同的pid,但它不。 它正在创建一个子进程。 通过在“中加入睡眠来验证。

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

在执行上面的脚本和运行ps显示两个进程one.sh(脚本的名称)和睡眠。

 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 

不知道我错过了什么。

解决方案是$! 。 如:

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

输出:

 $ ./prueba.sh parent 30207 child 30209