2013-07-03 1 views
7

У меня есть сценарий, который проверяет состояние выхода из следующей функции:Как проверить отсутствие ненужного статуса выхода команды в Bash?

function is_git_repository {              
    git branch &> /dev/null              
} 

который возвращает 0, если вы в мерзавца репо и 128, если вы не.

У меня нет проблем с тестированием, чтобы узнать, является ли возвращаемое значение 0; следующие работы, как и ожидалось:

if is_git_repository ; then 
    echo you are in a git repo 
else 
    echo you are NOT in a git repo 
fi 

Но когда я пытаюсь проверить статус выхода, что ничего, кроме 0, когда я бегу в проблемы. Я попытался следующие, но ни один из них не работает:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ... всегда принимает значение ИСТИНА (link)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... всегда принимает значение ложь
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... всегда истинен
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... всегда имеет значение false
  5. if [[ ! "$(is_git_repository)" ]] ; ... всегда имеет значение
  6. if !is_git_repository ; ... просто перекликается с c ommand назад ко мне, но без перерыва (wtf?)

Каков правильный способ проверить ненулевое состояние выхода команды в инструкции if?

+1

Вы, кажется, ищет $? – devnull

+0

«Источник», с которым вы связались, не был ни принятым, ни самым высоким голосовым ответом на вопрос. –

ответ

7

скоро я понял, что if ! is_git_repository ; then ... работ по назначению (смотрите под 7.1.2.1. Тестирование состояния выхода в Introduction to if), но почему? Я бы ожидал, что № 1 будет работать, по крайней мере, но я не знаю, почему это не так.

Кроме того, что с №6 ?!

+3

Когда вы говорите '' $ (is_git_repository) "', вы возвращаете * стандартный вывод * команды, а не * статус выхода *. Вы перенаправляете stdout и stderr, так что это всегда пустая строка, которая всегда не равна строке «0». bash чувствителен к пробелу, поэтому '!' должен стоять в одиночестве. Поскольку @devnull упоминает, если вам нужен статус выхода, вам нужна переменная '$?'. –

+0

@glennjackman Спасибо! Что объясняет его. А что же с «-ne»? Почему они оцениваются иначе, чем с '! ='? (т. е. почему пустая строка «равна» «0»/0 с «-ne», но не равна «0»/0 с '! ='?) – 3cheesewheel

+1

[арифметика оболочки] (http: // www. gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic) в разделе руководства: «Нулевое значение оценивается равным 0.» –

1

Рассмотрим булево ярлык вместо if в заявлении:

is_git_repository || echo you are NOT in a git repo