правило кода выхода команды bash pipe

1665
Chihaya

Я писал простой скрипт, который проверяет вывод команды, если она отображает определенное ключевое слово. Чтобы проверить, работает ли это, я проверял команду из командной строки bash.

 $ ls | grep -q foo $ echo $? 

Отображаемое значение 1 или 0 зависит от вывода команды и параметра grep, как я и ожидал.

Я немного ленив, чтобы набрать команду снова, поэтому я добавил | echo $?в конце командной строки.

 $ ls | grep -q foo | echo $? 

Затем, независимо от вывода команды, он всегда возвращает 0, даже если первая часть возвращает 1.

Я думаю, это нормальное поведение, но я хотел бы знать, почему bash работает таким образом.

-1
аналогично: http://superuser.com/questions/280879/exit-value-with-piped-commands-in-bash?rq=1 golimar 7 лет назад 0

2 ответа на вопрос

2
janos

Специальная переменная $? расширяется до состояния выхода последнего выполненного переднего конвейера . В вашем примере | echo $?самый последний выполняемый конвейер переднего плана, в этот момент состояние выхода команды перед последней |больше не доступно через $?.

В связанной заметке вы можете использовать код выхода непосредственно в условных выражениях, например:

if ls | grep -q foo; then echo success, there is foo; fi 

Или, если вы хотите выполнить что-то в случае успеха, вы можете связать следующую команду, используя &&:

ls | grep -q foo && echo success 
1
ojs

Это связано с тем, что канал принимает стандартный вывод и передает его следующей команде. Вместо него нужно использовать точку с запятой.

ls | grep -q foo; echo $?

Это закончил lsи grepкоманды, а затем выполняет echoкоманду.

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