tah*_*oar 10 package-management shell-script ubuntu apt
我想要一个 shell 脚本方法来测试/报告是否安装了软件包。我不需要细节,只需要布尔返回来设置逻辑流程。我查看了Find if a package is installed,但dpkg返回复杂的输出,其格式会根据软件包是在 Debian 存储库中还是在 Ubuntu PPA 中而发生变化。
我发现这apt-cache做得很好,我想出了这个方法:
is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1
Run Code Online (Sandbox Code Playgroud)
有谁知道更简单或更直接的方法?
Dan*_*son 12
dpkg-query 就像在您链接的帖子中一样,这似乎是最适合这项工作的工具,除了使用可用的 Python 库在这样的脚本上下文中直接绑定到 APT 系统。
与dpkg-query:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Run Code Online (Sandbox Code Playgroud)
0如果安装了包,将返回 true(shell 脚本中的退出状态1),否则返回false(退出状态)。
-W表示“显示”(dpkg-query必须具有请求的操作)。-f 改变输出的格式。db:Status-abbrev 是包裹状态的缩写形式。2>/dev/null沉默dpkg-query,如果一个无效的包名给出。这应该如何处理可能是一个个案问题。grep -q 如果匹配则返回真,否则返回假。如果经常使用,它可以被做成一个简单的函数:
#!/bin/sh
debInst() {
dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}
if debInst "$1"; then
printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi
Run Code Online (Sandbox Code Playgroud)
或者只是简单地
#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8332 次 |
| 最近记录: |