Bash将stderr重定向到for循环后的文件

时间:2018-11-25 20:44:50

标签: bash shell

我有以下脚本检查已安装/未安装的软件包:

#!/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)

即使使用重定向运算符&>,为什么粗体(未安装的软件包)中的行也丢失了?

2 个答案:

答案 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,并且没有出现任何显示。