加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 将stdin复制到stdout

发布时间:2020-12-15 21:44:29 所属栏目:安全 来源:网络整理
导读:我正在寻找一个bash one-liner,它将stdin复制到stdout而不进行交错.到目前为止我找到的唯一解决方案是使用tee,但这确实产生了交错输出.这是什么意思: 如果是文件f读取 ab 我想执行 cat f | HERE_BE_COMMAND 获得 abab 如果我使用tee – 作为命令,输出通常看
我正在寻找一个bash one-liner,它将stdin复制到stdout而不进行交错.到目前为止我找到的唯一解决方案是使用tee,但这确实产生了交错输出.这是什么意思:

如果是文件f读取

a
b

我想执行

cat f | HERE_BE_COMMAND

获得

a
b
a
b

如果我使用tee – 作为命令,输出通常看起来像

a
a
b
b

有关清洁解决方案的建议吗?

澄清

cat f命令只是输入来源的一个例子.实际上,它是一个可以(应该)只执行一次的命令.我还想避免使用临时文件,因为处理后的数据是敏感的,当执行的命令被中断时,临时文件总是容易出错.此外,我对涉及其他脚本(如上所述,它应该是单行)或准备命令的解决方案不感兴趣,这些命令需要在实际复制命令之前执行.

解决方法

解决方案1:

<command_which_produces_output> | { a="$(</dev/stdin)";  echo "$a"; echo "$a"; }

这样,你要保存标准输入中的内容(请选择一个更好的名字),然后再回声两次.

注意$(< / dev / stdin)是一种类似但更有效的方法来做$(cat / dev / stdin). 解决方案2: 以下列方式使用tee:

<command_which_produces_output> | tee >(echo "$(</dev/stdin)")

在这里,您首先要写入标准输出(这是tee所做的),并写入由process substitution创建的FIFO文件:

>(echo "$(</dev/stdin)")

例如,查看它在我的系统中创建的文件:

$echo >(echo "$(</dev/stdin)")
/dev/fd/63

现在,echo“$(< / dev / stdin)”部分就是我发现在打印之前首先读取整个文件的方式.它回显了从进程替换的标准输入读取的内容,但是一旦读取了所有输入(不像逐行打印的cat).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读