Shell - запустить дополнительную команду при ошибке - PullRequest
1 голос
/ 16 апреля 2010

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

 #!/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 ]

5 голосов
/ 16 апреля 2010

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

pdf2swf test.opt.pdf test.swf || pdf2swf test.pdf test.swf
1 голос
/ 16 апреля 2010

Попробуйте:

/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 работает в фоновом режиме, вы не представляете, сколько времени это займет, чтобы завершить. Пусть он блокируется, поэтому код в паренсе достигается только в том случае, если он сработал.

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

1 голос
/ 16 апреля 2010

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

...