Bash: запустіть command2, якщо command1 не працює


43

Я хочу зробити щось подібне:

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

Як мені це зробити?


1
Вам просто не вистачає ключового слова "тоді" перед командою "ехо-успіх".
glenn jackman

10
Хммм; ваш псевдокод, здається, задає інше запитання, ніж те, яке у вашому заголовку .....
mattdm

Хороший ресурс для деяких сценаріїв оболонок сценаріїв виходу 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, якщо інше очікує вихід кодів, 0 якщо команда де запущена і 1, якщо помилки. Не читайте на виході. Just try whoami && whoami && echo success || echo epic failі зараз whoami && whoareyou && echo success || echo epic fail. Я не можу зрозуміти, що ви маєте на увазі під "не дивиться на вихід першої команди ехо"
erm3nda

@mlissner Я думаю, що я отримав ваше запитання, але відповідь полягає в тому, що команда echo ніколи не вийде з ладу. Тобто, його повернення буде 0, тобто truthy. Тож умова, яка насправді має значення, простоcmd1 && cmd2
Казим Заїді

22

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

$? містить код виходу з останньої виконуваної команди, і якщо ви користуєтесь цим, ви можете писати свої сценарії досить гнучко.

Це питання трохи торкається цієї теми, Найкраща практика використання $? в баш? .

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

Тоді ви також можете реагувати на різні вихідні коди і робити різні речі, якщо вам подобається.


1
Моя компанія PHP Experts, Inc., і я хочу подякувати вам за те, що ви є невід'ємною частиною нашого внутрішнього сценарію CI. Дякую!
Теодор Р. Сміт

7

Псевдокод у питанні не відповідає заголовку питання.

Якщо комусь потрібно насправді знати, як запустити команду 2, якщо команда 1 не вдасться, це просте пояснення:

  • cmd1 || cmd2: Це буде запущено cmd1, а в разі відмови - запуститьсяcmd2
  • cmd1 && cmd2: Це запуститься cmd1, і в разі успіху він запуститьсяcmd2
  • cmd1 ; cmd2: Це запуститься cmd1, а потім воно запуститься cmd2, незалежно від відмови чи успіху запуску cmd1.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.