我是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
我的问题是:
非常感谢答案:)
首先,作业捕获孩子的标准输出并将其放入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