В zsh, как мне сделать условие на статус выхода программы?

Я хочу сделать что-то вроде:

if [[ git status &> /dev/null ]]; then
   echo "is a git repo";
else
   echo "is not a git repo";
fi

за исключением того, что я не знаю, как сделать проверку состояния выхода. Как это исправить?

Спасибо

Ответ 1

Переменная $? содержит код возврата последних команд

ОБНОВЛЕНИЕ: точный пример:

git status &> /dev/null
if [ $? -eq 0 ]; then
  echo "git status exited successfully"
else
  echo "git status exited with error code"
fi

Ответ 2

Просто так

if git status &> /dev/null
then
   echo "is a git repo";
else
   echo "is not a git repo";
fi

Или в более компактной форме:

git status &> /dev/null && echo "is a git repo" || echo "is not a git repo"

Ответ 3

Другой формой, которую я часто использую, является следующая:

git status &> /dev/null
if (( $? )) then
    desired behavior for nonzero exit status
else
    desired behavior for zero exit status
fi

Это немного более компактно, чем принятый ответ, но не требует, чтобы вы помещали команду в ту же строку, что и в ответе gregseth (иногда это то, что вам нужно, но иногда становится слишком трудно читать).

Двойные скобки предназначены для математических выражений в zsh. (Например, см. здесь.)

Редактировать: Обратите внимание, что синтаксис (( expression )) соответствует обычному соглашению большинства языков программирования: ненулевые выражения оцениваются как истина, а ноль - как ложь. Другие альтернативы ([ expression ], [[ expression ]], if expression, test expression и т.д.) Следуют обычному соглашению оболочки: 0 (без ошибок) оценивается как истинное, а ненулевые значения (ошибки) оцениваются как ложные. Поэтому, если вы используете этот ответ, вам необходимо переключить предложения if и else из других ответов.