exit
은 지정된 숫자 종료 코드 (생략하면 0)를 부모 프로세스로 반환하여 셸을 종료합니다. 이는 exit
이라고하는 C 라이브러리 루틴 또는 main
에서 복귀하는 것과 동일합니다.
exec
는이 조만간 종료를하고 부모 프로세스에 몇 가지 코드 또는 다른 반환 새로운 실행 이미지와 쉘이 (여전히 같은 프로세스에서 실행) 대체합니다. C 라이브러리 루틴 execvp
과 거의 같습니다.
첫 번째 예는 오류가 발생했을 때 스크립트를 중지하는 올바른 방법입니다. 그것은 당신의 예에서 누락
if [ ! -f file ]; then
echo "no file" >&2
exit 1
fi
>&2
, 읽어야 오류 메시지가 대신이 속하지 않는 stdout
,의, 자신이 속한 stderr
로 이동됩니다.
두 번째 예는 입니다.입니다. 오류 메시지가 잘못된 위치로 이동하는 것 외에도 exec echo
은 스크립트를 중지하지만 (/bin/echo
은 해당 작업을 수행 한 다음 종료합니다) 종료 코드 0을 부모 프로세스로 반환합니다. 종료 코드 0은 성공을 의미합니다. Unix 환경에서 실행되는 프로그램은 실패했을 때 항상 0이 아닌 종료 코드를 반환해야합니다.
exec
의 적절한 사용법은 설정 작업을하고 다른 언어로 작성된 수명이 긴 프로그램을 호출하는 쉘 스크립트에 있으며 이후에는 아무 것도하지 않으므로 쉘을 유지하는 것이 중요하지 않습니다 프로세스가 돌아 다니고 있습니다. 예 :
#! /bin/sh
PATH=/special/directory/for/foo:$PATH
export PATH
exec foo
잭, 대답 해줘서 고마워! 그래서 쉘 스크립트가이 수명이 긴 프로그램을위한 하우스 키핑 (housekeeping) 및/또는 설정 작업을 완료하면 _exec_는 주로 장기 실행 프로그램을 실행하는 데 사용되는 것을 의미합니까? _exec_를 사용하여 호출 된 프로그램은 _exec_?가 포함 된 스크립트의 PID를 사용합니다. 또한 bash _exec_에 대한 다른 인기있는 사용법이 있습니까? – Martin
예, 예, 아니요. – zwol
좋습니다. 그러나이 장기 프로그램이 _exec_없이 스크립트에서 호출되는 경우의 단점/차이점은 무엇입니까? 이 경우 두 개의 PID가있을 것이며 스크립트에 설정된 변수는 수명이 긴 프로그램에 아무런 영향을 미치지 않을 것입니다. 다른 건 없니? – Martin