Вы предполагаете, что foo | echo $?
покажет статус выхода foo
. Это не вариант. Вместо этого он показывает состояние выхода предыдущей команды или конвейера:
$ bash -c 'exit 42'
$ true | echo $?
42
Поэтому ваша команда работает так:
$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop
$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop
То, что вы намеревались подавить grep
output (здесь сделано с -q
), а затем добавить вторую команду (после ;
), которая может записать значение:
# Check for success when running a command and writing out
# the exit status and capturing it and comparing it to success
[ "`date | grep -q 20; echo $?`" -gt "0" ] && echo 12
Однако вы можете удалить все избыточности и просто делать:
# Check for success when running a command
date | grep -q 20 && echo 12