我是shell的新手,我刚刚了解到use(命令)会创建一个新的子shell并执行命令,所以我尝试打印父shell和子shell的pid:
#!/bin/bash
echo $$
echo "`echo $$`"
sleep 4
var=$(echo $$;sleep 4)
echo $var
但答案是:
$./test.sh
9098
9098
9098
我的问题是:
非常感谢您的回答:)
答案 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