代码之家  ›  专栏  ›  技术社区  ›  builder-7000

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

  •  0
  • builder-7000  · 技术社区  · 7 年前

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

    #!/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 . 但内容 依赖输出 是:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Amessihel    7 年前

    重定向 stderr stdout ,用途:

    command 2>&1
    

    论证:

    ls unexisting-path 2>&1 | cat > /dev/null
    

    在这里, ls 将产生错误输出。此输出重定向到 标准输出 所以它会被管子夹住 | 并发送到 cat ,输出到 标准输出 也是。为了证明这一点, > /dev/null 添加,如预期,不显示任何内容。

        2
  •  1
  •   Imre    7 年前

    很可能这些行是写入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