2012-01-16 6 views
3

오류가 발생하면 스크립트 실행을 중단하기 위해 bash 스크립트에서 "exit"와 "exec"를 모두 보았습니다.bash에서 "exec"와 "exit"의 차이점

if [ ! -f file ]; then 
echo "no file" 
exit 1 
fi 

과 : 예를 들어

if [ ! -f file ]; then 
exec echo "no file" 
fi 

는 가장 좋은 방법은 여기에 그 이유는 무엇입니까? "exec"및 "exit"에 대한 더 광범위한 토론/설명도 환영합니다.

답변

12

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 
+0

잭, 대답 해줘서 고마워! 그래서 쉘 스크립트가이 수명이 긴 프로그램을위한 하우스 키핑 (housekeeping) 및/또는 설정 작업을 완료하면 _exec_는 주로 장기 실행 프로그램을 실행하는 데 사용되는 것을 의미합니까? _exec_를 사용하여 호출 된 프로그램은 _exec_?가 포함 된 스크립트의 PID를 사용합니다. 또한 bash _exec_에 대한 다른 인기있는 사용법이 있습니까? – Martin

+0

예, 예, 아니요. – zwol

+0

좋습니다. 그러나이 장기 프로그램이 _exec_없이 스크립트에서 호출되는 경우의 단점/차이점은 무엇입니까? 이 경우 두 개의 PID가있을 것이며 스크립트에 설정된 변수는 수명이 긴 프로그램에 아무런 영향을 미치지 않을 것입니다. 다른 건 없니? – Martin

0

오류를 나타내는 적절한 방법은 스크립트가 1과 같이 0이 아닌 코드를 반환하는 것입니다. 가장 좋은 방법은 "exit 1"을 사용하는 것입니다.

"exec"를 사용하면 간단히 그 뒤에 코드가 실행됩니다. 아마도 여러분은 "#!/bin/bash -e"또는 "set -e"를 사용하고 "exec"를 사용하여 실패한 코드를 호출하여 "exec"자체가 0이 아닌 코드를 반환하도록하는 예를 보았을 것입니다 , "-e"는 명령이 0이 아닌 코드를 반환하거나 false로 평가되면 즉시 스크립트를 종료 함을 의미합니다.

+0

'exec'는'set -e' 또는 유사하게 스크립트를 효과적으로 종료하여 현재 프로세스를 새 프로세스로 대체합니다. –

+0

아, 명확한 스벤 감사합니다! – SteveK

3

exit 명령은 주어진 종료 코드로 현재 쉘을 종료합니다. exec 명령은 현재 셸을 인수로 정의 된 새 프로세스로 바꿉니다. 이것은 또한 프로세스가 종료 된 후에 스크립트를 효과적으로 종료하고 종료 코드는 새 프로세스의 종료 코드가됩니다.

코드 조각의 첫 번째는 내부 쉘 명령 echo를 호출 한 후 1. 두 번째는 아마 종료 코드로 종료됩니다 외부 프로그램 echo에 의해 쉘을 대체 종료 코드로 쉘을 종료 0

나는 첫번째 변종을 추천 할 것이다. 외부 명령 /bin/echo의 실행을 저장하고 종료 코드 오류를 올바르게 표시합니다.