Невозможность перехватить вывод из «dd» с помощью обратных галочек - PullRequest
1 голос
/ 23 августа 2011

Я работал с очень старой системой 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 ]

9 голосов
/ 23 августа 2011

dd выводит в stderr, в то время как обратные импульсы захватывают стандартный вывод.Это задокументировано в perlop :

Поскольку обратные пометки не влияют на стандартную ошибку, используйте синтаксис дескриптора файла оболочки (при условии, что оболочка поддерживает это), если вы хотите решить эту проблему.Чтобы захватить STDERR и STDOUT команды вместе:

$output = `cmd 2>&1`;

Вы можете сделать:

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

2 голосов
/ 23 августа 2011

Вы можете использовать strace или что-либо еще, что эта система предоставляет, чтобы выяснить это определенно, но есть два возможных варианта:

  • Выход отправляется в STDERR. Вы можете решить эту проблему, объединив STDERR и STDOUT (2>&1).
  • Вывод отправляется на tty. С этим ничего не поделаешь.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...