【发布时间】:2010-07-21 09:30:56
【问题描述】:
在 Mathematica 中,可以通过使用 % 重用上一个命令的输出。
对于 bash(或其他一些 shell)是否有类似的可能?
例如,我运行了一个给出警告的 make,但我想查找所有警告。 所以,我输入
make | grep "warning"
但我无法看到 make 的输出。
我想输入类似这样的内容:
make
% | grep "warning"
【问题讨论】:
在 Mathematica 中,可以通过使用 % 重用上一个命令的输出。
对于 bash(或其他一些 shell)是否有类似的可能?
例如,我运行了一个给出警告的 make,但我想查找所有警告。 所以,我输入
make | grep "warning"
但我无法看到 make 的输出。
我想输入类似这样的内容:
make
% | grep "warning"
【问题讨论】:
由于输出的数量是不确定的,bash 为你存储它以供重新显示是没有意义的。但是您的问题有另一种解决方案:
tee 命令允许您将输出流复制到文件中。因此,如果您愿意使用文件进行临时存储,则可以执行以下操作:
make | tee output.txt
grep "warning" output.txt
此解决方案避免了运行 make 两次,这可能 (a) 昂贵且 (b) 不一致:第二个 make 的工作量可能比第一个少,因为一些目标已经在第一次完成。
注意:我还没有尝试过。您可能需要摆弄加入错误和输出流等。
【讨论】:
你可以这样做:
make
!! | grep "warning"
通过使用!!,您可以告诉它重复该位置的最后一条命令,以及您要添加到其中的任何其他 bash 命令。
缺点是,如果您重复执行的命令需要很长时间才能执行,除非您先将前一个命令的输出存储到输出文件,否则您将有更长的等待时间。
【讨论】:
交换stdout 和stderr 流以记录整个stderr 流:
make 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr > stderr.log
【讨论】:
我不确定make 命令是否会向 stderr 发送警告,但我怀疑确实如此。试试这个
make 2&>1 |grep 'warning'
它将stderr重定向到stdout。
还应注意,您不能 grep 任何不会输出到标准输出的内容。
【讨论】:
如果您使用 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
【讨论】: