2015-03-13 44 views
0

我在這裏使用vagrant shell配置。 我已經在我的vm Node.js上安裝了許多其他軟件包。 我想避免在我不需要它們時在自動配置腳本中運行零件。 例如 - 我已經通過我的腳本Node.js & nginx成功安裝了,所以當我想添加其他軟件包如mysql或redis時,我想將它添加到腳本中,我想運行腳本來測試它運行正確,但我不想重新安裝Node.js或nginx ...
我需要一個簡單的條件語句來檢測包是否已經安裝,並且只有在它尚未安裝的情況下才能安裝它。
是否有通用支票或與包裝不同? 謝謝 Ajar如何僅在需要(尚未安裝)流浪殼上安裝Node.js?

回答

1
dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name> 

這應該是你在找什麼。

這是怎麼回事: 這是形式<condition> && <value if true> || <value if false>

表達的第一部分採用dpkg的檢查是否安裝了軟件包,抑制輸出的有條件分配。如果條件返回錯誤,則評估第二部分。 「真實」情況被省略。

1

這取決於您使用的Linux發行版。通常,軟件包管理器會附帶某種機制來清除已安裝的軟件包。

對於Ubuntu,這是內置的 - 運行apt-get install nodejs已經安裝的Node.js不會重新安裝它;它會跳過目標(除非有新版本可用)

對於ArchLinux,您可以添加運行pacman -Sy node --needed來跳過已安裝的軟件包。

獨立於平臺的機制是檢查是否存在可執行文件(或該包的任何其他已知文件)。在bash中,你可以這樣做:

which node > /dev/null && echo "Yup, this is installed"

(在> /dev/null部分supresses which的輸出 - 它打印在那裏找到的可執行文件所在的路徑;我們不關心,我們只是想知道,如果它被安裝)

如果你想避免爲這樣的基本檢查編寫自定義的Bash腳本,我可以推薦你配置你的盒子,專門用於你想要實現的工具。這裏的常客是:

所有這些都是由流浪支撐,整合他們不應該是一個問題。你可以找到詳細的指南,將其整合到現有的流浪配方here中。

PS。對於一個簡單的例子,你可以查看我的Ansible provisioning recipe運行ArchLinux的Banana Pi機器(注意:它並不真正遵循最佳實踐,但它可能是一個很好的起點)。網上有很多例子,請查看。

+0

嗨羅伯特&謝謝你的回覆! 我使用ubuntu,並且使用apt-get安裝的軟件包很好地知道它會自動檢查現有軟件包。然而,一些軟件包是從源代碼安裝的(比如節點js和其他的),所以我不能僅僅依靠這個。你的「哪一行」對我來說很好,我只需要休息一下......如果一個軟件包沒有安裝它。我是一個bash腳本的初學者。 在檢查不同的編排工具後,Ansible將成爲我的選擇,但是當我進行縮放時,我會進入它。 – Ajar 2015-03-14 11:51:47

+0

現在我只想創建簡單的部署工作流程,並且不能再購買另一條學習曲線。對我來說,現在這是一種矯枉過正的情況,儘管這些工具看起來很棒。那麼Doc​​ker - 機器/組合/羣集,CoreOS etcd/systemd /艦隊,Mesos Zookeeper等等......它永遠不會結束......我現在真正需要的只是一個簡單的bash「if」語句,它檢查如果一個軟件包已經安裝在我的Ubuntu服務器上並且安裝它,如果它沒有,你能幫我一下嗎? 乾杯,再次感謝羅伯特! – Ajar 2015-03-14 11:51:51

+0

也許[IF中的Bash教程](http://www.tldp.org/LDP/Bash-Beginners-Guide/html/chap_07.html)會有幫助嗎? – 2015-03-14 11:54:06