将标准输入转发到标准输出
forward stdin to stdout
我正在寻找一种方法 "forward" stdin 到管道中的 stdout,同时在该步骤中将某些内容写入 stderr。该示例应阐明这一点:
echo "before.." | >&2 echo "some logging..."; [[forward stdin>stdout]] | cat
这应该将 "before.."
输出到标准输出,同时将 "some logging..."
输出到标准错误。
怎么做?或者是否有另一种完全不同的方法?
重定向遵循它们引用的简单命令,因此
echo "before" >&1
echo "some logging..." >&2
应该可以解决问题,如果我理解您的意图。
根据您的意见,这是一个解决方案:
cat ~/.bashrc | tee >( cat -n >&2 ) | sort
cat ~/.bashrc
表示您的管道开始,产生一些数据。
tee
复制其输入,写入标准输出和任何列为参数的文件。
>( ... )
是一个 bash 构造,运行s ...
作为管道子命令,但用文件名替换自身(tee
可以打开的东西并写信给)。
cat -n
表示修改输入(增加行号)。
>&2
将标准输出重定向到标准错误。
sort
代表你的流水线结束(正常处理未改变的输入)。
将它们放在一起,bash 将
- 运行
cat ~/.bashrc
,将~/.bashrc
的内容输出到标准输出
- ... 通过管道传输到
tee
的标准输入
- 运行
cat -n
标准输出重定向到标准错误,标准输入重定向到新管道
- 运行
tee /dev/fd/63
(其中/dev/fd/63
表示cat -n
管道的另一端)
- 这就是一切汇集的地方:
tee
读取其输入并将其写入其标准输出和另一个通往 cat -n
(并从那里到 stderr)的管道
- 最后
tee
的标准输出进入 sort
我正在寻找一种方法 "forward" stdin 到管道中的 stdout,同时在该步骤中将某些内容写入 stderr。该示例应阐明这一点:
echo "before.." | >&2 echo "some logging..."; [[forward stdin>stdout]] | cat
这应该将 "before.."
输出到标准输出,同时将 "some logging..."
输出到标准错误。
怎么做?或者是否有另一种完全不同的方法?
重定向遵循它们引用的简单命令,因此
echo "before" >&1
echo "some logging..." >&2
应该可以解决问题,如果我理解您的意图。
根据您的意见,这是一个解决方案:
cat ~/.bashrc | tee >( cat -n >&2 ) | sort
cat ~/.bashrc
表示您的管道开始,产生一些数据。
tee
复制其输入,写入标准输出和任何列为参数的文件。
>( ... )
是一个 bash 构造,运行s ...
作为管道子命令,但用文件名替换自身(tee
可以打开的东西并写信给)。
cat -n
表示修改输入(增加行号)。
>&2
将标准输出重定向到标准错误。
sort
代表你的流水线结束(正常处理未改变的输入)。
将它们放在一起,bash 将
- 运行
cat ~/.bashrc
,将~/.bashrc
的内容输出到标准输出 - ... 通过管道传输到
tee
的标准输入
- 运行
cat -n
标准输出重定向到标准错误,标准输入重定向到新管道 - 运行
tee /dev/fd/63
(其中/dev/fd/63
表示cat -n
管道的另一端) - 这就是一切汇集的地方:
tee
读取其输入并将其写入其标准输出和另一个通往cat -n
(并从那里到 stderr)的管道 - 最后
tee
的标准输出进入sort