Автоматический запуск программы, если другая программа возвращает ошибку - PullRequest
3 голосов
/ 12 января 2010

У меня есть программа ( grabface ), которая делает снимок лица человека с помощью веб-камеры, и у меня также есть оболочка сценария оболочки, которая работает следующим образом:

Вкл.В командной строке пользователь дает сценарию имя запускаемой программы и аргументы ее командной строки.Затем скрипт выполняет заданную команду и проверяет код выхода.Если произошла ошибка, запускается программа grabface для захвата удивленного лица пользователя.

Это все работает довольно хорошо.Но проблема в том, что скрипт-обертка всегда должен использоваться.Есть ли способ автоматически запускать этот скрипт при вводе команды в оболочке?Или есть какой-то другой способ автоматического запуска данной программы после запуска любой программы?

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

Что-то, что, возможно, еще сложнее, - расширить это для работы с программами, запускаемыми извнеоболочки (например, из среды рабочего стола), но это может быть слишком сложно.

Редактировать: Потрясающе!Поскольку bash был таким простым, как насчет других оболочек?

Ответы [ 4 ]

5 голосов
/ 12 января 2010

В Bash вы можете использовать команду trap с аргументом ERR для выполнения указанной команды всякий раз, когда выполненная команда возвращает ненулевое значение.

$ trap "echo 'there was an error'" ERR
$ touch ./can_touch
$ touch ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa
touch: cannot touch `./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa': No such file or directory
there was an error

trap влияет на весь сеанс, поэтому вам нужно убедиться, что trap вызывается в начале сеанса, поместив его в .bashrc или .profile.

2 голосов
/ 12 января 2010

Просто замените вашу команду там, где у меня ложное.
false || echo "It failed"

Если вы хотите сделать опозицию, например, когда это удастся, просто поставьте свою команду вместо true:
true && echo "It succeeded"

2 голосов
/ 12 января 2010

Другие специальные trap сигналы, которые понимает Bash: DEBUG, RETURN и EXIT, а также все системные сигналы (которые могут быть перечислены с помощью trap -l).

Оболочка Korn имеет аналогичные возможности, в то время как оболочка Z имеет более широкие возможности ловушек.

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

1 голос
/ 12 января 2010

В .profile пользователя добавьте:

trap grabface ERR
...