无法使用反引号捕获“dd”的输出

时间:2011-08-23 07:21:36

标签: perl unix solaris backticks dd

我一直在使用一个非常旧的Solaris系统,并且无法添加更多模块以使我的生活更轻松,而且我正在使用许多使用各种命令行选项的脚本。

我正在研究的大多数事实上都在工作,但是我想出的东西似乎无法解决。

我使用“dd”命令从磁带中提取数据,需要捕获输出以确定我是否遇到任何磁带读取错误。

(“comment()”是我已创建的子程序)

#!/usr/local/bin/perl
$| = 1;     #disable output buffering

$tarfile = '/mnt/test/tmp/12345.tar';

@tapeinfo = `dd if=/dev/rmt/1cbn of=$tarfile`;

foreach(@tapeinfo){
#Check to ensure that we're not getting read errors
 $result = index($_,'read: I/O error');
 if ($result < 0){
  #No read error, log result
  comment($_);
  } else {
  # read error, terminate
  comment("Terminating due to tape read error : $_");
  last; #exit loop if error is found
  }
}
#terminate with logging

当脚本运行时,我看到“123 + 0记录,123 + 0记录”被发布到终端屏幕,但我的循环@tapeinfo似乎根本没有测试。我没有收到错误或记录信息。

我在这里错过了一些非常简单的东西吗?

2 个答案:

答案 0 :(得分:9)

当反引号捕获标准输出时,

dd输出到stderr。这在perlop

中有记录
  

由于反引号不会影响标准错误,因此请使用shell文件   描述符语法(假设shell支持这个),如果你愿意的话   解决这个问题要一起捕获命令的STDERR和STDOUT:

$output = `cmd 2>&1`;

你可以这样做:

my @tapeinfo = qx( dd if=/dev/rmt/1cbn of=$tarfile 2>&1 );

答案 1 :(得分:2)

您可以使用strace或系统提供的任何内容来明确查找,但两种可能的选项是

  • 输出发送到STDERR。您可以通过合并STDERR和STDOUT(2>&1)来解决这个问题。
  • 输出发送到tty。对此没什么可做的。