왜 exit status
다른가요?세게 때리다그리고껍데기? , 존재하다ls
남성:
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line
argument).
exit status
명령을 테스트하기 위해 이라는 파일이 ls
있다고 가정해 보겠습니다 ss
. 와일드카드를 사용하여 문자 상태에 따라 파일을 나열해 보겠습니다.?
csh 쉘에서:
ls -d ss
ss
ls -d s?
ss
ls -d ?s
ss
ls -d ?z
ls: No match.
ls -d ?z | echo $? #check exit status
0
큰 타격을 받은 경우:
ls -d ss
ss
ls -d s?
ss
ls -d ?s
ss
ls -d ?z
ls: cannot access ?z: No such file or directory
ls -d ?z | echo $? #check exit status
2
이는 동일한 명령이지만 ls
다음 사이에 종료 상태가 다릅니다.csh shell
bash
- csh 쉘의 종료 상태는 다음과 같습니다.
0
- Bash의 종료 상태는 다음과 같습니다.
2
이제 질문은 다음과 같습니다.
ls
1) bash 및 csh 쉘에서 동일한 명령의 종료 상태가 다른 이유는 무엇입니까 ?
2) bash 및 csh 쉘에서 명령 동작의 이러한 차이점은 무엇을 의미합니까?
답변1
첫째, ls -d ?z | echo $?
Bash에서 측정하는 것은 당신이 생각하는 것과 다릅니다. 파이프라인은 모두 즉시 시작되고 그 전에도 매개변수 확장이 발생하므로 echo $?
반환 코드가 인쇄됩니다 .더 일찍파이프 앞의 명령 대신 명령. csh에서는 이 작업도 수행하지 않습니다. 그 출력은 의미가 없습니다. 별도의 명령으로 실행하면 ls -d ?z ; echo $?
실제 종료 코드에 대한 정보 출력을 얻게 됩니다.
sh -c 'exit 53'
원하는 위치에서 실제로 종료 코드를 가져오고 있는지 테스트하는 명령 역할을 합니다.
둘째, 비록 귀하가 우리에게 말하지는 않았지만 첫 번째 예의 오류는 csh처럼 들리므로 그게 전부라고 가정합니다. 이 경우,ls -d ?z
ls
전혀 실행되지 않음; 쉘의 와일드카드 확장이 실패하고 No match
오류(" ")를 보고하여 명령이 실행되지 않습니다.기본적으로 Bash는 일치하지 않는 와일드카드를 문자 그대로 전달합니다.:실제로 실행하면 파일이 존재하지 않기 때문에 ls '?z'
오류가 발생합니다 . ls
어쨌든 보고된 오류 코드는 이전 줄에서 나온 것입니다.
따라서 ls
명령은 실행될 때 모든 경우에 동일하게 작동하지만 때로는 실행되지 않습니다.
Bash의 (솔직히, 나쁜) 동작을 변경할 수 있습니다그리고shopt -s failglob
. glob이 일치하지 않으면 오류가 발생합니다.
/tmp$ ls ?z
ls: cannot access '?z': No such file or directory
/tmp$ shopt -s failglob
/tmp$ ls ?z
bash: no match: ?z
첫 번째는 Bash 자체의 종료 코드 2를 갖고 ls
, 두 번째는 $?
Bash 자체의 종료 코드 1을 갖습니다.