我正在寻找一种 bash 单行代码,可以将标准输入复制到标准输出而不需要交错。到目前为止我找到的唯一解决方案是使用tee
,但这确实产生了交错输出。我这样说是什么意思:
如果例如一份文件f
reads
a
b
我想执行
cat f | HERE_BE_COMMAND
获得
a
b
a
b
如果我使用tee -
作为命令,输出通常类似于
a
a
b
b
对于干净的解决方案有什么建议吗?
澄清
The cat f
命令只是输入来源的一个示例。实际上,它是一个只能(应该)执行一次的命令。我也想避免使用临时文件,因为处理后的数据是sort of当执行的命令被中断时,敏感文件和临时文件总是容易出错。此外,我对涉及额外脚本的解决方案不感兴趣(如上所述,它应该是一个一行)或需要在实际复制命令之前执行的准备命令。
解决方案一:
<command_which_produces_output> | { a="$(</dev/stdin)"; echo "$a"; echo "$a"; }
通过这种方式,您可以将标准输入中的内容保存在a
(请选择一个更好的名字),然后echo
'ing 两次。
Notice $(</dev/stdin)
是一种类似但更有效的方法$(cat /dev/stdin)
.
解决方案2:
Use tee
通过以下方式:
<command_which_produces_output> | tee >(echo "$(</dev/stdin)")
在这里,您首先写入标准输出(这就是tee
),并且还写入由过程替代 https://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution:
>(echo "$(</dev/stdin)")
例如,请参阅它在我的系统中创建的文件:
$ echo >(echo "$(</dev/stdin)")
/dev/fd/63
现在echo "$(</dev/stdin)"
部分正是我发现在打印之前首先读取整个文件的方式。它echo
'es 从进程替换的标准输入中读取的内容,但是一旦读取了所有输入(不像cat
逐行打印)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)