我可以在我的 Ubuntu 16.04(xenial)安装的命令行上很好地执行这些命令:
apt list --installed
apt list --installed | grep grep
Stdout 接收结果以及以下行:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
当将其放入脚本中时,我假设我必须使用“apt-get”或“apt-cache”之类的东西 - 但尝试后发现它们都不支持我给出的选项。相反,我得到的是:
E: Command line option --installed is not understood in combination with the other options
删除“--installed”部分后,我得到了这个:
E: Invalid operation list
应该使用哪种 apt 命令行工具变体来以稳定的方式执行此查询?(我绝对希望有一种不会发出那些“警告:”行的工具变体。)
答案1
资质具有自定义格式的包搜索。
使用 aptitude 搜索软件包时,搜索词用于限制搜索,在本例中为“已安装”包。然后使用不区分大小写的模式执行常用表达(通过在模式中添加“^”“$”锚点,可以匹配精确的包名称)。使用-F
选项,可以使用以下方式形成自定义的输出格式字符串:%转义。
例子:
$ aptitude search '?narrow(?installed, "^grep$")' -F '%p (%v)' -q=2 --disable-columns
grep (3.3-1)
(包含简短搜索词的脚本示例)
#!/bin/bash
read -r package_name package_version < <(aptitude search '~i^grep$' -F '%p %v' -q=2 --disable-columns 2>&-)
echo $package_name
echo $package_version
exit 0
搜索词参考:
?narrow() - 选择单个版本与过滤器和模式匹配的软件包。
?installed - 选择已安装的软件包。
转义占位符:
%p - 输出包的名称。
%v - 输出包的当前安装版本。
能力选项:
-F - 指定显示输出的格式。
-q - 禁止所有进度指示器。多次提供可使输出更安静。--
disable-columns - 此选项使搜索输出其结果而不带任何特殊格式。
获取套餐选择软件包。
$ dpkg --get-selections grep
grep install
或者
$ dpkg -l grep
ii grep 3.3-1 amd64 GNU grep, egrep and fgrep
(脚本示例)
#!/bin/bash
if [[ $(dpkg --get-selections grep 2>&-) =~ .+[[:space:]]+install$ ]]; then
echo Installed
fi
或者
#!/bin/bash
if (( $(dpkg -l grep 2>&- | grep -c ^ii) == 1 )); then
echo Installed
fi
使用以下方式获取包裹状态dpkg-查询。
$ dpkg-query --showformat='${Package}\t${Version} (${db:Status-Status})\n' --show grep
grep 3.3-1 (installed)
(脚本示例)
#!/bin/bash
if [[ $(dpkg-query --showformat='${db:Status-Status}' --show grep 2>&-) == 'installed' ]]; then
echo Installed
fi