конвейер и код возврата команды
Модераторы: /dev/random, Модераторы разделов
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
конвейер и код возврата команды
Имеется конвейер вида command | sed [...] | dialog --gauge [...]. Каким образом можно проверить код возврата command?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
- /dev/random
- Администратор
- Сообщения: 5289
- ОС: Gentoo
Re: конвейер и код возврата команды
Обычно в bash пайплайн возвращает статус самой правой команды. Если же включить опцию pipefail (set -o pipefail), то будет возвращаться статус самой правой из _завершившихся с ошибкой_ команд. Если и sed, и dialog здесь отработают успешно, то будет возвращён статус command.
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: конвейер и код возврата команды
/dev/random писал(а): ↑21.02.2014 10:39Если же включить опцию pipefail (set -o pipefail), то будет возвращаться статус самой правой из _завершившихся с ошибкой_ команд.
Спасибо, в bash действительно работает. А более универсалного способа нет? В данном случае желательно было бы использовать dash.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
- /dev/random
- Администратор
- Сообщения: 5289
- ОС: Gentoo
Re: конвейер и код возврата команды
Bizdelnick писал(а): ↑21.02.2014 10:50А более универсалного способа нет? В данном случае желательно было бы использовать dash.
"Встроенного" способа в dash нет. Но, в принципе, можно сохранить статус в файл и затем прочитать:
{ command; echo $? > tmpfile; } | sed ... | dialog ...
status=$(cat tmpfile)
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: конвейер и код возврата команды
Ясно, спасибо.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: конвейер и код возврата команды
в bash ещё есть массив PIPESTATUS:
В dash, такого, правда нет.
Код: Выделить всё
$ echo 1 | tr 1 2 | dfjksl | echo
-bash: dfjksl: command not found
$ echo ${PIPESTATUS[*]}
0 0 127 0
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: конвейер и код возврата команды
SLEDopit
Спасибо, это я уже нагуглил.
Спасибо, это я уже нагуглил.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: конвейер и код возврата команды
никаким. Можно вот так посмотреть:
Shell
$ ( /bin/false; echo $? ) | ( cat; /bin/sleep 1 )
1
дело в том, что команды одновременно выполняются, и код возврата левой будет потерян.
Bizdelnick писал(а): ↑21.02.2014 10:50А более универсалного способа нет? В данном случае желательно было бы использовать dash.
а использование конвейера обязательно?