我正在尝试创建一个基本上将任何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')]
之后执行命令(表示数据被传送到的命令)
任何意见都将不胜感激 - 谢谢!
答案 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