exit
просто выходит из оболочки, возвращая указанный числовой код завершения (или 0, если не указан) в родительский процесс. Это эквивалентно подпрограмме библиотеки C, также называемой exit
, или возвращению из main
.
exec
заменяет оболочку новым исполняемым образом (все еще работающим в том же процессе), который со временем завершит работу и вернет некоторый код или другой в родительский процесс. Это примерно эквивалентно подпрограмме библиотеки C execvp
.
Ваш первый пример - почти, но не совсем, правильный способ остановить скрипт, если произошла ошибка. Следует читать
if [ ! -f file ]; then
echo "no file" >&2
exit 1
fi
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *..
Ваш второй пример - неправильно . В дополнение к сообщению об ошибке, помещающемуся в неправильное место, exec echo
остановит скрипт (потому что /bin/echo
выполнит свою работу и затем завершится), но вернет код выхода 0 родительскому процессу. Код выхода 0 означает успех . Программы, работающие в среде Unix, всегда должны возвращать ненулевой код завершения, если они потерпели неудачу.
Правильное использование exec
в сценариях оболочки, которые выполняют некоторую настройку, а затем вызывают долгоживущую программу, написанную на другом языке, и после этого не нужно ничего делать, поэтому нет смысла сохранять процесс оболочки висит вокруг. Например:
#! /bin/sh
PATH=/special/directory/for/foo:$PATH
export PATH
exec foo