静默运行“dpkg -s”或“-l”

Pou*_*uya 6 dpkg scripts output

我正在编写一个脚本来检查非常大的依赖项列表。所以我写了一个函数来获取包名作为输入并使用dpkg检查它是否安装并打印适当的输出。这是此功能的一个版本:

check_dependency() { 
    dpkg -l $1 > /dev/null
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}
Run Code Online (Sandbox Code Playgroud)

安装包时工作正常。但是当它没有安装时,它以某种方式不会将输出重定向到/dev/null并提示:

dpkg-query: no packages found matching foo-bar
Run Code Online (Sandbox Code Playgroud)

在第二次尝试中,我修改了函数体以将其用于grep -q

check_dependency() { 
    dpkg -s $1 | grep -q 'installed'
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}
Run Code Online (Sandbox Code Playgroud)

安装软件包后,它似乎再次正常工作,但是,当找不到软件包并且dpkg终端上出现不需要的消息时:

dpkg-query: package 'foo-bar' is not installed and no information is available bla bla...
Run Code Online (Sandbox Code Playgroud)

直接使用会dpkg-query导致类似的问题。找不到包时如何让它静音?

Gsx*_*r1k 4

您希望将标准输出 (stdout) 和标准错误 (stderr) 重定向到/dev/null. 为此,请替换>&>. 这是特定于 的快捷方式bash。所以你的代码将是:

check_dependency() { 
    dpkg -l $1 &> /dev/null
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}
Run Code Online (Sandbox Code Playgroud)

但是,如果软件包已被删除但配置文件仍然存在(正如@AB 所指出的),这仍然会将其视为已安装。相反,你可以尝试

check_dependency() { 
    # Get the number of packages installed that match $1
    num=$(dpkg -l "$1" 2>/dev/null | egrep '^ii' | wc -l)

    if [ $num -eq 1 ]; then
        # print something saying it is installed
    elif [ $num -gt 1]; then
        # print something saying there is more than one package matching $1
    else
        # print something saying it was not found
    fi
}
Run Code Online (Sandbox Code Playgroud)


A.B*_*.B. 2

使用dpkg -l $1和检查返回代码并不能说明软件包的安装状态。

使用awkdpkg -l检查状态ii

dpkg -l | awk '/^ii +'"$1"' +/'
Run Code Online (Sandbox Code Playgroud)

例子

$ package="mc"
$ dpkg -l | awk '/^ii +'"$package" +' /'
ii  mc      3:4.8.13-3      i386       Midnight Commander - a powerful file manager

$ package="foobar"
$dpkg -l | awk '/^ii +'"$package" +' /'
<returns nothing>
Run Code Online (Sandbox Code Playgroud)

或者

$ package="mc"
$ dpkg -l | awk '/^ii +'"$package"' +/ {print $2}'
mc
Run Code Online (Sandbox Code Playgroud)