2017-06-06 54 views
0

我正在運行以下bash腳本,以便在它崩潰時重新啓動我的Perforce服務器,但是我想要做的就是讓bash腳本運行一個Python腳本來發送帶有退出的webhook該應用程序的代碼到我的Slack頻道。將bash值傳入Python

Python腳本允許你做類似python app.py 225的工作,但它的工作原理是,但我想要將$?傳遞到該腳本中,如python app.py $?

每當服務重新啓動回波行報告退出代碼正確(在它顯示225中的終端),但是當送入Python腳本$?顯示爲0。

#!/bin/bash 

until ~/Desktop/shell/p4d; do 
    echo "Perforce Server crashed with exit code $?. Respawning.." >&2 
    sleep 1 
    python ~/Desktop/shell/app.py $? 
done 

的Python腳本的代碼段,其獲取參數:

if __name__ == "__main__": 
    error = str(sys.argv[1]) 
    print error 
    post_message(error) 

我該怎麼做?

+0

好,'$'將舉行'0'爲'睡眠1',據推測,退出,退出代碼'0' ... Bash很古怪; – zwer

+0

'$?'在這個例子中是'sleep 1'的退出碼,而不是'p4d'。將它作爲一個變量存儲在直到循環內ftw –

+0

開開口,這裏是一個[很好的回答](https://unix.stackexchange.com/a/99134)關於發生了什麼事情。 – zwer

回答

2

$?的行爲就像一個變量。每次調用程序(例如p4d,sleep,python)之後,該命令的返回值將由bash存儲在$?中。

在你的情況下,$?包含p4d的返回值,當你「回聲」它。之後,你調用「睡眠」,這實際上是一個程序「/ bin/sleep」,所以$?的值被sleep的返回代碼替換爲0。 因此python腳本被調用爲「0」好。

解決你的問題,你可以緩存返回代碼中的局部變量,是這樣的:

#!/bin/bash 

until ~/Desktop/shell/p4d; do 
    P4D_RETURN=$? 
    echo "Perforce Server crashed with exit code $?. Respawning.." >&2 
    sleep 1 
    python ~/Desktop/shell/app.py $P4D_RETURN 
done 
+0

完美感! –