我正在编写一个 bash 脚本,需要测试 VPS 上是否安装了某些库,如果没有,脚本将安装它们。
我的问题是能够让脚本确定它们是否存在。我的主要想法是使用这个:
ldd /usr/lib/libgd.so > /tmp/lddcheck 2>/dev/null
将 ldd 结果输出到一个文件,然后我可以使用 grep 或其他东西来搜索我正在寻找的库。如果它们不存在,我将安装它们,否则脚本将继续。
不确定具体该怎么做。任何帮助将不胜感激(对于 bash 脚本来说相当新)。
答案1
鉴于你将要使用某种包管理器来安装库,仅仅拥有您需要的包列表不是更容易吗?想要安装并以某种方式确保它们已安装?
据我所知,100% 的包管理器都有某种模式(通常是默认模式),如果未安装包,则安装它;如果已安装但旧版本,则将其更新到最新版本;如果它已经是最新的,则直接通过。
例如,apt-get
您始终可以apt-get install a b c d ...
确保已安装软件包a
, b
, c
, 。d
随之yum
而来的是yum install a b c d
,等等。
如果您在 VPS 中使用具有不同包管理器的各种系统,那么您最终将编写一些逻辑来检测它使用哪个包管理器,因此这一步是不可避免的。
答案2
按照建议执行 ldd 命令后,您可以尝试使用类似的命令
grep "not found" /tmp/lddcheck | awk '// { print $1 }'
获取丢失的库的名称。
答案3
假设您需要的库支持它,您应该使用pkg-config
,这就是它的用途。
$ pkg-config --exists libnotify
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$
您可以使用它来检查版本,告诉您包含或库路径等。
答案4
如果您不熟悉脚本编写,请记住这一点:您很少需要临时文件;您很少需要临时文件。当您需要对某些数据进行多个阶段的处理时,请使用管道。您可以在 的输出上使用许多文本处理工具ldd
。在这里,我将使用awk
, 来检测第三个空格分隔字段所在的行not
(而不是库的路径),并打印第一个字段(库名称)。我将输出收集到一个变量中,该变量将包含以空格分隔的缺失库列表。
missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
# whatever it takes to install $x
done
请注意,这可能不是正确的方法。如果您要支持特定发行版,则不要制作与包管理器进行自定义交互的通用二进制包。为该发行版分发一个包。
包管理器使系统管理员的工作变得更加轻松;不能很好地使用包管理器会让你的用户感到困惑和愤怒。如果您分发 rpm 和 deb 等,您的用户只需要安装您的软件包的依赖项即可。这样,你的包就会被记录下来,并且可以使用用户习惯的包管理工具来安装、升级和卸载,而不是通过执行一些可疑的脚本。