bash 쉘과 csh 쉘에서 "ls" 명령의 종료 상태가 다른 이유는 무엇입니까?

bash 쉘과 csh 쉘에서 "ls" 명령의 종료 상태가 다른 이유는 무엇입니까?

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 shellbash

  • csh 쉘의 종료 상태는 다음과 같습니다.0
  • Bash의 종료 상태는 다음과 같습니다.2

이제 질문은 다음과 같습니다.

ls1) bash 및 csh 쉘에서 동일한 명령의 종료 상태가 다른 이유는 무엇입니까 ?

2) bash 및 csh 쉘에서 명령 동작의 이러한 차이점은 무엇을 의미합니까?

답변1

첫째, ls -d ?z | echo $?Bash에서 측정하는 것은 당신이 생각하는 것과 다릅니다. 파이프라인은 모두 즉시 시작되고 그 전에도 매개변수 확장이 발생하므로 echo $?반환 코드가 인쇄됩니다 .더 일찍파이프 앞의 명령 대신 명령. csh에서는 이 작업도 수행하지 않습니다. 그 출력은 의미가 없습니다. 별도의 명령으로 실행하면 ls -d ?z ; echo $?실제 종료 코드에 대한 정보 출력을 얻게 됩니다.

sh -c 'exit 53'원하는 위치에서 실제로 종료 코드를 가져오고 있는지 테스트하는 명령 역할을 합니다.


둘째, 비록 귀하가 우리에게 말하지는 않았지만 첫 번째 예의 오류는 csh처럼 들리므로 그게 전부라고 가정합니다. 이 경우,ls -d ?zls전혀 실행되지 않음; 쉘의 와일드카드 확장이 실패하고 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을 갖습니다.

관련 정보