我有以下脚本检查已安装/未安装的软件包:
#!/bin/bash
DEPENDENCIES="build-essential pkg-config qt4-qmake libqt4-dev libavformat-dev libavcodec-dev"
for dep in $DEPENDENCIES; do
dpkg -l $dep | grep "$dep"
done | sort
结果是:
dpkg-query: no packages found matching libavformat-dev dpkg-query: no packages found matching libavcodec-dev ii build-essential 12.1ubuntu2 amd64 Informational list of build-essential packages ii pkg-config 0.29.1-0ubuntu1 amd64 manage compile and link flags for libraries un libqt4-dev (no description available) un qt4-qmake (no description available)
这是我所期望的。然后,我想将stdout和stderr重定向到文件depend.out
。因此,我将脚本的最后一行修改为:done | sort &> depend.out
。但是depend.out
的内容是:
ii build-essential 12.1ubuntu2 amd64 Informational list of build-essential packages
ii pkg-config 0.29.1-0ubuntu1 amd64 manage compile and link flags for libraries
un libqt4-dev <none> <none> (no description available)
un qt4-qmake <none> <none> (no description available)
即使使用重定向运算符&>
,为什么粗体(未安装的软件包)中的行也丢失了?
答案 0 :(得分:1)
这些行很可能是写到您的stderr的,因此它们没有被重定向到管道(而是写在tty上) 如果您还希望管道处理stderr,则需要在进行管道传输之前将其手动重定向到stderr(因为管道仅作用于stdout)
尝试这个:
#!/bin/bash
DEPENDENCIES="build-essential pkg-config qt4-qmake libqt4-dev libavformat-dev libavcodec-dev"
for dep in $DEPENDENCIES; do
dpkg -l $dep 2>&1 | grep "$dep"
done | sort
答案 1 :(得分:0)
要将stderr
重定向到stdout
,请使用:
command 2>&1
演示:
ls unexisting-path 2>&1 | cat > /dev/null
此处,ls
将产生错误输出。此输出重定向到stdout
,因此它被管道|
捕获并发送到cat
,后者也将其输出到stdout
。为了证明这一点,添加了> /dev/null
,并且没有出现任何显示。