用于捕获任何STDERR数据的函数

时间:2017-02-27 21:16:59

标签: bash stdout stderr io-redirection tee

我正在尝试创建一个基本上将任何STDERR重定向到STDOUT的函数。 在执行命令时我熟悉重定向,例如:

$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | COMMAND_HERE | grep bar
bar

但我正在尝试做的是编写一个函数,可以用来重定向上一个命令发送给stderr的所有数据。像这样:

$ function 2to1 { exec 2>&1; }
$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | 2to1 | grep bar
foo
bar
baz
quux
$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | tee >(cat 2>&1) | grep bar
foo
bar
baz
quux

我打算在一个函数中使用它,但是直接通过命令行使用函数源(可以正常工作)同样容易。

以下是我尝试过的一些事情,其中​​没有一项有效:

2to

如果tee函数或stderr命令的工作方式与我想要的一样,那么输出只会是 bar

我发现一些文章/主题有点暗示,除非我在执行命令后执行重定向,否则我将无法看到df[(df['CPULabel']=='BP100_Fast') | (df['CPULabel']=='100LoBW_Fast') | (df['CPULabel']=='100HiBW_Fast')] df[(df['CPULabel']=='BP100_Slow') | (df['CPULabel']=='100LoBW_Slow') | (df['CPULabel']=='100HiBW_Slow')] 之后执行命令(表示数据被传送到的命令)

任何意见都将不胜感激 - 谢谢!

2 个答案:

答案 0 :(得分:1)

您不能使用普通管道,因为只有stdout被重定向到管道。

您可以使用process substitution,指明您希望将stderr重定向到2>(...)的流程。

echo -e "foo\nbar\nbaz\nquux" 2>(2to1 | grep bar) 1>&2

答案 1 :(得分:1)

您无法在管道中执行此操作。需要使用2to1按顺序调用echo,就像直接调用exec一样。你没有管道exec,你先叫它。

$ 2to1() { exec 2>&1; }
$ { 2to1; echo -e "foo\nbar\nbaz\nquux" 1>&2; } | grep bar
bar