Попробуйте перенаправить stderr в stdout и использовать $()
для его перехвата. Другими словами:
VAR=$((your-command-including-redirect) 2>&1)
Поскольку ваша команда перенаправляет stdout куда-то, она не должна мешать stderr. Возможно, есть более чистый способ написать это, но это должно работать.
Редактировать:
Это действительно работает. Я протестировал:
#!/bin/bash
BLAH=$((
(
echo out >&1
echo err >&2
) 1>log
) 2>&1)
echo "BLAH=$BLAH"
выводит BLAH=err
, а файл log
содержит out
.
Вы можете сохранить ссылку на стандартный вывод до того, как она будет перенаправлена в другой номер файла (например, 3), а затем перенаправить на него stderr:
result=$(mysqldump --user=$dbuser --password=$dbpswd \
--host=$host $mysqldb 3>&1 2>&3 | gzip > $filename)
Итак, 3> & 1
будет перенаправить файл номер 3 на стандартный вывод (обратите внимание, что это происходит до того, как стандартный вывод будет перенаправлен каналом). Затем 2> & 3
перенаправляет stderr в файл номер 3, который теперь совпадает с stdout. Наконец, stdout перенаправляется путем подачи в канал, но это не влияет на номера файлов 2 и 3 (обратите внимание, что перенаправление stdout из gzip не связано с выходными данными команды mysqldump).
Изменить: обновлена команда для перенаправления stderr из команды mysqldump
, а не gzip
, я был слишком быстр в моем первом ответе.
dd
записывает и stdout, и stderr:
$ dd if=/dev/zero count=50 > /dev/null
50+0 records in
50+0 records out
два потока независимы и перенаправляются отдельно:
$ dd if=/dev/zero count=50 2> countfile | wc -c
25600
$ cat countfile
50+0 records in
50+0 records out
$ mail -s "countfile for you" thornate < countfile
если вам действительно нужна переменная:
$ variable=`cat countfile`