【问题标题】:Using output of previous commands in bash在 bash 中使用先前命令的输出
【发布时间】:2010-07-21 09:30:56
【问题描述】:

在 Mathematica 中,可以通过使用 % 重用上一个命令的输出。

对于 bash(或其他一些 shell)是否有类似的可能?

例如,我运行了一个给出警告的 make,但我想查找所有警告。 所以,我输入

make | grep "warning"

但我无法看到 make 的输出。

我想输入类似这样的内容:

make
% | grep "warning"

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    由于输出的数量是不确定的,bash 为你存储它以供重新显示是没有意义的。但是您的问题有另一种解决方案:

    tee 命令允许您将输出流复制到文件中。因此,如果您愿意使用文件进行临时存储,则可以执行以下操作:

    make | tee output.txt
    grep "warning" output.txt
    

    此解决方案避免了运行 make 两次,这可能 (a) 昂贵且 (b) 不一致:第二个 make 的工作量可能比第一个少,因为一些目标已经在第一次完成。

    注意:我还没有尝试过。您可能需要摆弄加入错误和输出流等。

    【讨论】:

    • 对。存储整个输出实际上没有意义。 tee 命令似乎很有用。我试过了。完美运行。谢谢。
    【解决方案2】:

    你可以这样做:

    make
    !! | grep "warning"
    

    通过使用!!,您可以告诉它重复该位置的最后一条命令,以及您要添加到其中的任何其他 bash 命令。

    缺点是,如果您重复执行的命令需要很长时间才能执行,除非您先将前一个命令的输出存储到输出文件,否则您将有更长的等待时间。

    【讨论】:

      【解决方案3】:

      交换stdoutstderr 流以记录整个stderr 流:

      make 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr > stderr.log
      

      【讨论】:

        【解决方案4】:

        我不确定make 命令是否会向 stderr 发送警告,但我怀疑确实如此。试试这个

        make 2&>1 |grep 'warning'
        

        它将stderr重定向到stdout。

        还应注意,您不能 grep 任何不会输出到标准输出的内容。

        【讨论】:

          【解决方案5】:

          如果您使用 tee 将输出流复制到 /dev/stderr,则不需要临时文件;另外,在那之后,您可以使用 sed 过滤标准输出流以创建 make_warning.log 文件 - 全部在一行 Unix shell 管道中。

          make 2>&1 | tee /dev/stderr | \
             sed -E -n 's/(.*[Ww][Aa][Rr][Nn][Ii][Nn][Gg].*)/\1/p' > make_warning.log
          

          【讨论】:

            猜你喜欢
            • 2023-01-23
            • 1970-01-01
            • 2012-07-10
            • 1970-01-01
            • 2020-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            相关资源
            最近更新 更多