Shell - запустить дополнительную команду при ошибке

У меня есть этот скрипт, который я сейчас запускаю, который отлично работает для всех экземпляров, кроме одного:

 #!/bin/sh
 pdfopt test.pdf test.opt.pdf &>/dev/null
 pdf2swf test.opt.pdf test.swf
 [ "$?" -ne 0 ] && exit 2

Другие строки для выполнения следуют приведенному выше коду...

Как бы я изменил этот скрипт для запуска?pdf2swf test.pdf test.swf" если "pdf2swf test.opt.pdf test.swf"не удается? Если вторая попытка не удалась, я бы"exit 2".

Спасибо

3 ответа

Решение

Пытаться:

/path/to/pdfopt test.pdf test.opt.pdf >/dev/null && {

    pdf2swf test.opt.pdf test.swf
    ... maybe do more stuff here, in the future ...
    exit_here_nicely
} 

code_that_is_reached_if_pdfopt_failed

В вашем примере:

pdfopt test.pdf test.opt.pdf &>/dev/null

... pdfopt работает в фоновом режиме, вы не знаете, сколько времени может потребоваться для завершения. Пусть он блокируется, поэтому код в паренсе достигается только в том случае, если он работает.

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

Короткое замыкание "ИЛИ" должно делать то, что вы хотите:

pdf2swf test.opt.pdf test.swf || pdf2swf test.pdf test.swf

Может быть, вы хотите Makefile вместо сценария оболочки. Makefile автоматически прерывает работу при сбое одной из команд. Кроме того, вы можете добавить [ "$?" -ne 0 ] && exit 2 после каждой команды

Другие вопросы по тегам