我在这里使用vagrant shell配置。
我已经在我的vm Node.js上安装了许多其他软件包。
我想避免在我不需要它时在配置脚本中运行部件。
例如 - 我已经通过我的脚本Node.js&成功安装了nginx,所以当我想添加其他软件包如mysql或redis时,我想将它添加到脚本中,我想运行脚本来测试它是否正常运行,但我不想重新安装Node.js或nginx再次...
我需要一个简单的条件语句来检测是否已安装软件包,并且只有在尚未安装软件包时才安装它
是否存在通用检查,或者包装与包装有什么不同?
谢谢
Ajar
答案 0 :(得分:1)
这取决于您正在使用的Linux发行版。通常,包管理器附带某种机制来skipp已安装的包。
对于Ubuntu,这是内置的 - 运行apt-get install nodejs
已经安装了Node.js将不会重新安装它;它将跳过目标(除非有新版本可用)
对于ArchLinux,您可以添加运行pacman -Sy node --needed
以跳过已安装的软件包。
独立于平台的机制是检查可执行文件(或该软件包的任何其他已知文件)是否存在。在Bash中,你可以这样做:
which node > /dev/null && echo "Yup, this is installed"
(> /dev/null
部分压缩which
的输出 - 它打印找到的可执行文件所在的路径;我们不关心它,我们只想知道它是否已安装)
如果您想避免为此类基本检查编写自定义Bash脚本,我建议您使用专用于您正在尝试实现的工具来配置您的盒子。这里通常的嫌疑人是:
所有这些都得到Vagrant的支持,因此整合它们应该不是问题。您可以找到有关将这些内容整合到现有Vagrant配方中的详细指南here。
PS。对于一个简单的例子,您可以查看我的Ansible provisioning recipe运行ArchLinux的Banana Pi机器(注意:它并不是真正遵循最佳实践,但它可能是一个很好的起点)。网上有很多例子,也可以查看。
答案 1 :(得分: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检查包是否已安装,从而抑制输出。如果条件返回false,则评估第二部分。 “真实”案例被省略。