Сценарий Bash - хранит stderr в переменной [дубликат]

48
задан codeforester 24 March 2017 в 04:12
поделиться

3 ответа

Попробуйте перенаправить 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.

84
ответ дан 26 November 2019 в 18:40
поделиться

Вы можете сохранить ссылку на стандартный вывод до того, как она будет перенаправлена ​​в другой номер файла (например, 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 , я был слишком быстр в моем первом ответе.

5
ответ дан 26 November 2019 в 18:40
поделиться

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`
0
ответ дан 26 November 2019 в 18:40
поделиться
Другие вопросы по тегам:

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