Возможно ли захватить вывод cmd2
из cmd1 | cmd2
, все еще зная, записал ли cmd1
в stderr
?
Я использую exiftool
для вырезать данные exif из файлов:
exiftool "/path/to/file.ext" -all= -o -
Записывает вывод в stdout
. Это работает для большинства файлов. Если файл поврежден или не является файлом видео / изображения, он ничего не записывает в stdout
и вместо этого записывает ошибку в stderr
. Например:
Error: Writing of this type of file is not supported - /path/to/file.ext
В конечном итоге мне нужно захватить md5 файлов, которые не приводят к ошибке. Прямо сейчас я делаю это:
md5=$(exiftool "/path/to/file.ext" -all= -o - | md5sum | awk '{print $1}')
Независимо от того, является ли файл изображением / видео, он вычислит md5.
Если файл является изображением / видео, он ' захватит md5 файла, как и ожидалось.
Если файл не изображения / видео, exiftool
ничего не записывает в stdout
, и поэтому md5sum
вычисляет md5 нулевого ввода. Но эта строка также напишет ошибку в stderr
.
Мне нужно иметь возможность проверить, было ли что-то записано в stderr
, поэтому я знаю, что нужно отбросить вычисленный md5.
I Я знаю, что одна альтернатива - запустить exiftool
дважды: один раз без md5sum
и без захвата, чтобы увидеть, было ли что-то записано в stderr
, а затем второй раз с md5sum
и захватом. Но это значит, что я должен запустить exiftool
дважды. Я хочу избежать этого, потому что это может занять много времени для больших файлов. Я бы предпочел запустить его только один раз.
Обновление
Кроме того, я не могу зафиксировать вывод только exiftool
, потому что он выдает эту ошибку:
bash: warning: command substitution: ignored null byte in input
И я не могу игнорировать эту ошибку, потому что результат md5 не совпадает. То есть:
file=$(exiftool "/path/to/file.ext" -all= -o -)
echo "$file" | md5sum
Распечатает вышеуказанную ошибку нулевого байта и не будет иметь такой же результат md5, как:
exiftool "/path/to/file.ext" -all= -o - | md5sum