Wednesday, 2 March 2011

Bash, pipe и код завершения программы

Всем известно, что такое код возврата программы, но далеко не все знают, по какому алгоритму возвращается код возврата, если несколько программ объединены в pipe (например, cat /var/log/ | grep | gzip > ... ). В данном случае Bash вернет код возврата только последней программы. То есть, если первая или вторая программы сбойнули, выдав код возврата 1 (повествующий об ошибки), но последняя программа выдала успех (нулевой код возврата), то вся pipe последовательность считается успешной и возвращается код нуль, повествующий об успехе.

Выглядит это так:
# false | true
# echo $?
0

Разумеется, это совершенно не адекватное поведение и мало кому такой расклад будет полезен. Поэтому новые версии Bash могут вести себя иначе, возвращать первый не нулевой код возврата, возникший в pipe цепочки. То есть, если отказала первая команда - будет возвращен ее код возврата, если вторая - ее, если третья, последняя, то ее.

Выглядит это так:
# set -o pipefail
# false | true
# echo $?
1

Вот такая вот фича :)

Источник: http://bclary.com/blog/2006/07/20/pipefail-testing-pipeline-exit-codes/

No comments:

Post a Comment

Note: only a member of this blog may post a comment.