2011-11-15 35 views
14

我使用這個命令將文件導入到我的服務器:shell腳本動作,如果兩個文件是不同

scp [email protected]:/test/test/test/server.py /test/test/test/test.py~/; 

我要重新啓動我的服務器,如果新導入的文件test.py〜從test.py不同已經存在。我將如何使用shellcript來做到這一點?

+0

我希望你的意思是「重新啓動我的守護」而不是「重新啓動我的服務器」 – Sorpigal

+0

你可能不希望最後的「/;」在那個命令上,因爲它不是一個目錄,並且在同一行上沒有其他命令。 –

+0

@peter你的意思是如果一個文件的負載不同於一個文件並檢查每個文件?在你的評論中我的答案在下面。 – gadgetmo

回答

4

你可以diff()這兩個文件。零(0)的返回碼意味着沒有區別。一(1)的返回碼錶示文件不同。

+1

這正是我想要做的。再次,我是新手,你認爲你給我提供了一個例子或鏈接的例子嗎? – Spencer

+0

@peter查看我的答案,例如/鏈接。 – gadgetmo

+0

爲什麼在爲此編譯「cmp」時使用diff? – Sorpigal

42
if ! cmp test.py test.py~ >/dev/null 2>&1 
then 
    # restart service 
fi 

斷裂下來:

  • cmp test.py test.py~返回true(0)如果test.py和test.py〜是相同的,否則爲假(1)。你可以在man cmp看到這個。
  • !將結果反轉,因此if語句轉換爲「如果test.py和test.py〜不同」。
  • 重定向>/dev/null 2>&1cmp的所有輸出發送到null device,因此您只需得到真/假比較結果,而不會在控制檯上產生任何不必要的噪音。
+0

+1,但-q是非標準的。重定向到/ dev/null將始終有效。 –

+0

對不起,有人能解釋bash noob的第一行嗎? if運算符的論點的優先順序是什麼?爲什麼有這兩個重定向,它們是什麼意思? – user1512321

+0

@AndrewSchulman:謝謝,我用了一個腳本。如果我明白了這一點,布爾輸出和stdout都會被髮送到if,所以只需要布爾答案,就必須將stdout發送給位桶。 – user1512321

0

我會做這樣的事情

[email protected]$ cat /test/test/test/server.py | ssh [email protected] 'cat - > /test/test/test/test.py.new ; cmp /test/test/test/test.py /test/test/test/test.py.new || (mv /test/test/test/test.py.new /test/test/test/test.py ; echo issue restart command here)'