【问题标题】:Catch output of several piped commands捕获几个管道命令的输出
【发布时间】:2017-03-13 10:45:39
【问题描述】:

直到今天,我总能找到我所有 bash 问题的答案。但现在我卡住了。我正在测试在 LSI 9265 上运行的 20TB RAID6 配置。

我编写了脚本来从 /dev/urandom 创建文件,并且我正在创建第二个脚本来从具有两个插件的所有文件中计算 md5。 一种是使用time命令计算md5sum执行时间 其次是使用 pv 命令显示每个 md5sum 命令的进度

我的命令如下所示:

filename="2017-03-13_12-38-08"
/usr/bin/time -f "real read %E" pv $filename | md5sum | sed "s/-/$filename /"

这是示例终端打印输出:

/usr/bin/time -f "real read %E" pv $i | md5sum | sed "s/-/$i/"
1GiB 0:00:01 [ 551MiB/s] [==================================================================================================>] 100%
real read 0:01.85
f561af8cc0927967c440fe2b39db894a  2017-03-13_12-38-08

我想将它记录到文件中。我使用 2>&1、使用 tee、使用括号的所有尝试都失败了。我知道 pv 使用 stdErr 但这无助于找到解决方案。我只能赶上“f561af8cc0927967c440fe2b39db894a 2017-03-13_12-38-08_done” 这还不够。

【问题讨论】:

  • 您能否向我们展示您实际尝试通过管道传输到文件的命令?这些应该可以工作。
  • 这些是我试图将输出放入文件的命令: /usr/bin/time -f "real read %E" pv $filename | md5sum | sed "s/-/$filename /" > output 2>&1 我刚刚找到了解决方案 (time pv -f $i | md5sum | sed "s/-/$i/") 2>&1 | tee output.log 或等效但不打印到终端仅文件 output.log (time pv -f $i | md5sum | sed "s/-/$i/") > output.log 2>&1
  • 你已经正确地发现了问题,即你需要将你想要管道的命令包装在括号中,否则你只会得到最后一个命令的输出。您应该将其发布为下面的答案并将其标记为这样!

标签: bash pipe stdout stderr


【解决方案1】:

这是解决方案:

(time pv -f $filename | md5sum | sed "s/-/$filename/") 2>&1 | tee output.log 

或等效但不打印到终端仅文件到 output.log

(time pv -f $filename | md5sum | sed "s/-/$filename/") > output.log 2>&1

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2015-02-05
    • 1970-01-01
    • 2011-11-15
    • 2017-02-26
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多