Правило кода выхода команды bash pipe
Я писал простой скрипт, который проверяет вывод команды, если она отображает определенное ключевое слово. Чтобы проверить, работает ли это, я проверял команду из командной строки bash.
$ ls | grep -q foo $ echo $?
Отображаемое значение 1 или 0 зависит от вывода команды и параметра grep, как я и ожидал.
Мне немного лень набирать команду снова, поэтому я добавил | echo $?
в конце командной строки.
$ ls | grep -q foo | echo $?
Затем, независимо от вывода команды, он всегда возвращает 0, даже если первая часть возвращает 1.
Я думаю, это нормальное поведение, но я хотел бы знать, почему bash работает таким образом.
2 ответа
Это связано с тем, что канал принимает стандартный вывод и передает его следующей команде. Вместо него нужно использовать точку с запятой.
ls | grep -q foo; echo $?
Это закончил ls
а также grep
команды, а затем выполняет echo
команда.
Специальная переменная $?
расширяется до состояния выхода последнего выполненного переднего конвейера. В вашем примере | echo $?
это последний выполненный передний план конвейера, в этот момент состояние выхода команды перед последним |
больше не доступен через $?
,
В связанной заметке вы можете использовать код выхода непосредственно в условных выражениях, например:
if ls | grep -q foo; then echo success, there is foo; fi
Или, если вы хотите выполнить что-то в случае успеха, вы можете связать следующую команду, используя &&
:
ls | grep -q foo && echo success