2016-11-23 62 views
0

我在使用bash -c时将PID保存到变量中时遇到问题。例如:如何将PID保存到bash -c中的变量?

bash -c "PID=$$; echo $PID" 

在这种情况下,输出为空。如何在变量中保存现在变量中的子PID(变量内的命令的PID)PID

+0

你说的是哪PID?你当前正在运行的bash shell的PID,或者你正在启动的shell? – hetepeperfan

+0

@hetepeperfan双引号内的子命令的PID。 – 1072

+0

你能否在你的问题中明确说明,以便将来的读者,充分利用你的问题 – hetepeperfan

回答

1

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 
+0

感谢与'set -x'的提示 – 1072

2

只是使用简单的引号,或者表达式在当前命令行中(太快)而不是在子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' 
+1

OP是否应该采用父bash shell的PID还是新启动的bash shell有点不清楚。 +1表示两种选择! – hetepeperfan

+0

什么时候我必须在child-command中使用简单的引号? – 1072

+0

@hetepeperfan再次XY问题!我在答案中增加了两种可能性。也许“通过父母”是最有用的。没有必要将自己的进程ID传递给子进程。 –

相关问题