2017-04-07 103 views
0

我試圖在shell腳本中運行命令,並使用生成的進程ID設置變量。剝離下來的相關部分,我有:腳本文件中的變量替換和設置新變量

#!/bin/bash 
USER=myAppUser 
PATH_TO_APP=/opt/folder/subfolder 
PID=`su - $USER -c 'nohup $PATH_TO_APP/myapp --option > /dev/null 2>&1 & echo $!'`; 
echo $PID 

我明白,我需要使用各地的變量替換nohup命令雙引號,但如果我這樣做,PID沒有被設置。如果我使用雙引號和硬編碼PATH_TO_APP它將執行並設置PID。我猜這是一個問題,結合的反標和單/雙引號..但我不知道什麼解決方案是。

+0

爲什麼你需要使用反引號?只需運行該命令並執行'PID = $!' – Barmar

+1

在現代shell中,您應該使用$(stdout emission)來代替\ stdout emission \' –

+0

哦,我明白了,您正在獲取進程的PID由'su'運行,而不是'su'過程。 – Barmar

回答

0

在雙引號把命令,以便將$PATH_TO_APP被取代,然後逃避$!$所以它將被逐字在參數包括以su,然後由子shell處理。

PID=$(su - $USER -c "nohup $PATH_TO_APP/myapp --option > /dev/null 2>&1 & echo \$!") 
echo $PID 
+0

Ahh沒有轉義'$'就是爲什麼當我使用雙引號時它不工作。謝謝! – Nikki

+0

沒錯,因爲它在原始shell中擴展'$!',而不是子shell。 – Barmar