如何限制循环执行的命令的Shell脚本中的输出

时间:2019-03-14 10:24:54

标签: linux shell scripting ubuntu-16.04

我有一个如下的shell脚本

#!/usr/bin/env bash


#Packages list

declare -a packages=( git build_essential node )
declare -a packages_status

# installing=`apt-get install -y `
installing="echo "

for i in "${packages[@]}"
do
    packages_status[$i]=$(dpkg-query -W -f='${status}' $i | grep "install ok installed")
    # echo ${packages_status[$i]}
done

代码行

packages_status[$i]=$(dpkg-query -W -f='${status}' $i | grep "install ok installed")

产生以下输出

  

dpkg查询:找不到与build_essential匹配的软件包

     

dpkg查询:找不到与节点匹配的软件包

我希望LOC在不产生任何输出的情况下执行。

2 个答案:

答案 0 :(得分:2)

dpkg-query命令将错误输出到stderr,而不是stdout。
因此,在管道传输到grep之前,应该先链接两个通道:

packages_status[$i]=$(dpkg-query -W -f='${status}' $i 2>&1 | grep "install ok installed")

通过这种方式,脚本将只为已安装的软件包打印“ install ok installed”行。

答案 1 :(得分:1)

为了不看到错误输出,您可以将该输出(流号2)重定向到NULL设备:

Do_Whatever 2>/dev/null

为了看不到任何输出,您可以将正常输出(流号1)重定向到NULL设备,也将错误输出也重定向到该设备:

Do_Whatever >/dev/null 2>&1