나는 Linux bash 스크립팅을 배우려고 노력하고 있으며 다음을 읽었습니다.http://tldp.org웹사이트에서 일종의 로그 지우기 스크립트를 보았고 뭔가가 종료 상태로 사용되고 있음을 발견했습니다. 아래 기사의 일부 스크립트 조각을 포함했습니다.
#!/bin/bash
# Cleanup, version 3
# Warning:
# -------
# This script uses quite a number of features that will be explained
#+ later on.
# By the time you've finished the first half of the book,
#+ there should be nothing mysterious about it.
LOG_DIR=/var/log
ROOT_UID=0 # Only users with $UID 0 have root privileges.
LINES=50 # Default number of lines saved.
E_XCD=86 # Can't change directory?
E_NOTROOT=87 # Non-root exit error.
E_NOTROOT(86)과 E_XCD(87)가 둘 다 프로그램의 예약된 종료 상태 코드를 사용하는 경우 무엇을 합니까?
또는
두 변수 모두 이 목적으로 난수를 사용하는 경우입니다.
답변1
일반적으로 모든 프로세스의 종료 상태는 POSIX에 의해 8비트(부호 없는) 정수 값으로 정의되므로 가능한 값은 0에서 255(포함) 사이입니다.
WEXITSTATUS(stat_val)
_exit()
[이] 매크로는 자식 프로세스와 주고받는 상태 매개변수의 하위 8비트exit()
또는 자식 프로세스에서 반환된 값을 평가합니다main()
.잠깐(3p)C 표준은 종료 성공 또는 실패를 각각 나타내기 위해 exit()에 전달될 수 있는 두 개의 상수
EXIT_SUCCESS
를 지정합니다.EXIT_FAILURE
출구(3)
관례적으로 EXIT_SUCCESS
0과 같고 0이 아닌 모든 값은 잘못된 부호로 처리됩니다.
그러나 Bash를 포함한 POSIX와 유사한 셸은 내부 사용을 위해 일련의 높은 종료 상태를 유지하여 명령이 명시적인 종료 상태를 반환할 기회 없이 호출된 명령에서 문제가 발생했음을 나타냅니다(배쉬 매뉴얼):
셸의 경우 종료 상태 0으로 종료된 명령이 성공했습니다. 종료 상태 0은 성공을 나타냅니다. 0이 아닌 종료 상태는 실패를 나타냅니다. 명령이 치명적인 신호 N으로 종료되면 bash는 종료 상태로 128+N 값을 사용합니다. 명령을 찾을 수 없으면 명령을 실행하기 위해 생성된 하위 프로세스는 상태 127을 반환합니다. 명령이 발견되었지만 실행 가능하지 않은 경우 반환 상태는 126입니다.
실제로 1에서 125 사이의 값은 프로그램별 방식으로 오류를 나타내는 데 사용될 수 있습니다. @mosvy가 댓글에서 암시했듯이,BSD 노력일부 의미 있는 종료 코드를 표준화했지만 일반적으로 사용되지는 않았습니다. 이러한 균일한 종료 코드는 64부터 시작하며, 그 이하의 코드는 프로그램별 사용을 위해 예약되어 있습니다. "정규화된" 가장 높은 값은 78이므로 예제에 언급된 값은 순전히 임의의 프로그램별 코드임이 분명합니다.
답변2
모든 실행에는 종료 상태가 있습니다. 일반적으로 0은 정상을 의미하고 0이 아닌 경우 오류를 의미합니다. 이 값은 기본적으로 표준 출력에 나타나지 않습니다. echo $?
실행된 각 명령 후에 이 값의 입력을 볼 수 있습니다 .
예를 들어, 다음을 입력하면:
mkdir test;echo $?
올바른 권한이 있는 경우 디렉터리를 생성하면 0이 표시됩니다.
mkdir testing/test;echo $?
그러나 올바른 권한으로 작성했지만 "test" 하위 디렉터리 없이 작성하는 경우 오류 메시지가 표시된 다음 "1"이 표시됩니다.
명령이 상호 연결될 수 있기 때문에 이것은 GNU/Linux에서 매우 중요한 도구입니다. 그리고 (예를 들어) 이중 앰퍼샌드를 사용하여 명령을 연결하면 두 번째 명령은 종료 시 첫 번째 명령의 값이 0인 경우에만 실행됩니다. 명령을 연결하는 방법에는 여러 가지가 있습니다. 자세히 알아보려면 입력하세요.man bash