我在使用bash -c
时将PID保存到变量中时遇到问题。例如:如何将PID保存到bash -c中的变量?
bash -c "PID=$$; echo $PID"
在这种情况下,输出为空。如何在变量中保存现在变量中的子PID(变量内的命令的PID)PID
我在使用bash -c
时将PID保存到变量中时遇到问题。例如:如何将PID保存到bash -c中的变量?
bash -c "PID=$$; echo $PID"
在这种情况下,输出为空。如何在变量中保存现在变量中的子PID(变量内的命令的PID)PID
set -x
对调试有用,会告诉你,到头来前缀+
实际的命令:
$ set -x
$ bash -c "PID=$$; echo $PID"
+ bash -c 'PID=1900; echo '
事实上,在该命令中,您会期望空输出。发生这种情况是因为$$
和$PID
被替换为之前bash
被调用。
为了避免这种情况,你可以单引号的字符串或难逃“$”符号:
$ set -x
$ bash -c 'PID=$$; echo $PID'
+ bash -c 'PID=$$; echo $PID'
1925
$ bash -c "PID=\$\$; echo \$PID"
+ bash -c 'PID=$$; echo $PID'
1929
感谢与'set -x'的提示 – 1072
只是使用简单的引号,或者表达式在当前命令行中(太快)而不是在子bash中命令,PID
还没有在这个时刻定义,你实际上是通过
bash -c "PID=4353; echo"
(其中4353是当前bash进程的PID)
有人指出,目前还不清楚,如果你想通过家长pid或孩子pid
通过父PID,解决这个问题是这样的(只有双引号内的部分评估之前调用bash的子进程):
bash -c "PID=$$; "'echo $PID'
通过孩子PID,解决它像这样(没有进行评估在当前shell,用于awk
脚本)同样的伎俩:
bash -c 'PID=$$; echo $PID'
OP是否应该采用父bash shell的PID还是新启动的bash shell有点不清楚。 +1表示两种选择! – hetepeperfan
什么时候我必须在child-command中使用简单的引号? – 1072
@hetepeperfan再次XY问题!我在答案中增加了两种可能性。也许“通过父母”是最有用的。没有必要将自己的进程ID传递给子进程。 –
你说的是哪PID?你当前正在运行的bash shell的PID,或者你正在启动的shell? – hetepeperfan
@hetepeperfan双引号内的子命令的PID。 – 1072
你能否在你的问题中明确说明,以便将来的读者,充分利用你的问题 – hetepeperfan