Bash: запустить command2, если не удалось выполнить command1

43

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

if cmd1 && cmd2
echo success
else
echo epic fail
fi

как мне это сделать?

michelemarcon
источник
1
Вам просто не хватает ключевого слова then перед командой echo success.
Гленн Джекман
10
Хммм; Ваш псевдокод, похоже, задает другой вопрос, чем тот, который
указан
Хороший ресурс для некоторых условий сценариев оболочки выхода pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Ответы:

71

Они должны делать то, что вам нужно:

cmd1 && cmd2 && echo success || echo epic fail

или

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Петр Узел
источник
3
Это работает, но я запутался, почему ||не смотрит на вывод первой echoкоманды.
mlissner
1
@mlissner, if else ожидает выхода из кодов, 0, если команда была запущена и 1, если произошла ошибка. Не читайте на выходе. Just try whoami && whoami && echo success || echo epic failи сейчас whoami && whoareyou && echo success || echo epic fail. Я не могу понять, что вы подразумеваете под "не смотрит на вывод первой команды эха"
m3nda
@mlissner Думаю, я получил твой вопрос, но ответ таков: команда echo никогда не подведет. То есть его возвращение будет 0, т.е. правдивым. Итак, условие, которое действительно имеет значение, это простоcmd1 && cmd2
Казим Заиди
22

Петр Узел на месте, но вы также можете играть с магическим $ ?.

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

Этот вопрос немного затрагивает эту тему. Лучшая практика использования $? в баш? ,

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Тогда вы также можете реагировать на разные коды выхода и делать разные вещи, если хотите.

Johan
источник
1
Моя компания, PHP Experts, Inc., и я хочу поблагодарить вас за то, что вы стали неотъемлемой частью нашего внутреннего скрипта CI. Спасибо!
Теодор Р. Смит
7

Псевдокод в вопросе не соответствует названию вопроса.

Если кому-то действительно нужно знать, как запустить команду 2, если команда 1 не выполнена, это простое объяснение:

  • cmd1 || cmd2: Это будет работать cmd1, и в случае сбоя это будет работатьcmd2
  • cmd1 && cmd2: Это будет работать cmd1, и в случае успеха это будет работатьcmd2
  • cmd1 ; cmd2: Это запустится cmd1, а затем запустится cmd2независимо от сбоя или успешности выполнения cmd1.
Орландо Ривера Летелье
источник