Как перенаправить stderr в переменной, но сохранить stdout в консоли [дубликат]

В итоге я сделал что-то вроде:

ffmpeg -i input-file.mkv -vcodec h264 -s:v 1280x800 -acodec copy output-file.mkv

Примечание: использование -vcodec copy не работает, так как это обходит декодирование/кодирование полностью и, таким образом, не позволяет применять фильтры. Уменьшение масштаба видео до такой степени привело к значительному уменьшению файлов и решению проблем с производительностью. Я также попробовал еще больше ограничить битрейт с помощью -b, но это привело к заметному снижению качества и не повлияло на производительность воспроизведения.

4
09.10.2018, 12:21
4 ответа

Просто используйте:

{ err=$(cmd 2>&1 >&3 3>&-); } 3>&1

Чтобы получить стандартный вывод cmd, оставив его стандартный вывод нетронутым (здесь, используя fd 3 для введите исходный стандартный вывод (, скопированный с помощью3>&1)внутри подстановки команды (восстановлен с помощью >&3после того, как мы перенаправили fd 2 в канал, созданный заменой команды на2>&1)).

7
27.01.2020, 20:47

Вы можете использовать ответ, предоставленный Stéphane Chazelas с небольшими изменениями :, только перенаправить stderr и не использовать подстановку команд для запуска вашей команды.

{
  command 2> /dev/fd/3
  res=$?
  err=$(cat<&3)
} 3<<EOF
EOF

printf 'stderr: %s\n' "$err"

Вывод commandобычно будет выводиться в stdout, а stderr — в переменной err.

3
27.01.2020, 20:47

Просто замените stdout и stderr на команду для захвата stderr.

pull=$(sudo./pull "${TAG}" 3>&2 2>&1 1>&3)

А затем перенаправить stderr обратно на stdout:

{ pull=$(sudo./pull "${TAG}" 3>&2 2>&1 1>&3; } 2>&1

Пояснение:

Так же, как при захвате только стандартного вывода команды:

var=$(cmd)

вывод stderr по-прежнему поступает в командную строку. Вы можете поменять местами оба канала, чтобы захватить только stderr:

var=$(cmd 3>&2 2>&1 1>&3)

Затем перенаправьте стандартный вывод обратно на стандартный вывод (, чтобы отобразить вывод (, если он есть )).

{ var=$(f 3>&2 2>&1 1>&3); }  2>&1
1
27.01.2020, 20:47

Объединение ответов из Как вывести на экран переопределяющее перенаправление и Как захватить stderr ключевого слова bash (, например. время )? , я получаю

var=$( (cmd >/dev/tty) 2>&1)

Если вы не используете встроенную функцию или ключевое слово, это упрощается до

var=$( cmd 2>&1 >/dev/tty )
1
27.01.2020, 20:47

Теги

Похожие вопросы