2017-04-04 51 views
2

我正在嘗試執行一個腳本,分離,延遲和在後臺。nohup打電話與睡眠評估不正確

我有以下腳本:

#!/bin/sh 
echo "[$(date)][${HOST}] Immediate date" > ~/out.log 
nohup bash -c "sleep 2 && echo '[$(date)][${HOST}] Delayed date'" >> ~/out.log 2>&1 & 

我希望out.log將包含像這樣正好兩行:

[Tue Apr 4 08:55:56 CEST 2017][] Immediate date 
[Tue Apr 4 08:55:58 CEST 2017][] Delayed date 

注意時間戳是間隔2秒。而是BOT日期閱讀完全相同的時間...

[Tue Apr 4 08:55:56 CEST 2017][] Immediate date 
[Tue Apr 4 08:55:56 CEST 2017][] Delayed date 

當我嘗試沒有nohupbash -c是否如預期的輸出,但調用腳本將不得不繼續運行,否則,第二個命令會中止。

是什麼原因導致日期沒有改變並解決它?

編輯:

我已經簡化了計算器的命令。但現在當我再次展開時,我遇到了另一個可變擴展問題。當我添加了HOST變量:

HOST=foo.bar 
nohup bash -c 'sleep 2 && echo "[$(date)][${HOST}]" Delayed date' >> ~/out.log 2>&1 & 

輸出文件DOS不包含foo.bar

[Tue Apr 4 12:52:11 CEST 2017][] 
+0

它是錯的,如果包括'睡眠2'只是第一個'echo'和'nohup'命令之間?這不會解決你的目的嗎? – Inian

+0

這是行不通的,它會導致調用程序等待2秒,而是我希望調用程序繼續執行,只有命令稍後執行(大約1分鐘左右) –

回答

2

$(date)由外shell腳本評估。如果您將"'對換,它的工作原理與您預期的一樣。這是因爲雙引號中的$(..)已解決,即使您將其放在雙引號字符串中的單引號中。

#!/bin/sh 
echo "[$(date)][${HOST}] Immediate date" > ~/out.log 
nohup bash -c 'sleep 2 && echo "[$(date)]['"${HOST}"'] Delayed date"' >> ~/out.log 2>&1 & 

編輯:使代碼工作w.r.t. $HOST + $ HOST containing whitespace

+0

好點,但建議使擴展本地只是'nohup bash -c'sleep 2 && echo [「$(date)」] [「$ {HOST}」]延遲日期'' – Inian

+0

這個答案解決了一半的問題:日期是正確,但現在'$ {HOST}'仍然沒有解決 –

+1

@HarmDoedens通過編輯處理。「中斷「$ {HOST}變量周圍的單引號字符串。 –

0

我相信nohup中的雙引號會立即評估nohup命令中的表達式。 更改您的雙引號爲單引號(並使用雙引號的回聲可能會有幫助,例如

#!/bin/sh 
echo "[$(date)][${HOST}] Immediate date" > ~/out.log 
nohup bash -c 'sleep 2 && echo "[$(date)][${HOST}] Delayed date"' >> ~/out.log 2>&1 &