bash를 직접 호출하거나 소프트 링크를 통해 호출하면 결과가 달라집니다.

bash를 직접 호출하거나 소프트 링크를 통해 호출하면 결과가 달라집니다.

내 Red Hat Linux 시스템에 /bin/sh링크가 있습니다.bash

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 27 13:17 /bin/sh -> bash

이 고안된 테스트 프로그램을 직접 실행하면 예상한 답변을 얻을 수 있었습니다.

$ cat ./test.sh
#!/bin/sh
# Just a test program to illustrate an issue
case "b" in
    (a)   echo "a"; break;;
    (b)   echo "b"; break;;
    (c)   echo "c"; break;;
esac

$ ./test.sh 
b

하지만 명시적으로 실행 bash하거나 호출할 초기 줄을 변경하면 bash오류가 발생합니다. 나는 이것이 아마도 실제 bash버그라는 것을 알고 있습니다. 그런데 왜 이런 차이가 있습니까?

$ /bin/bash ./test.sh
b
./test.sh: line 5: break: only meaningful in a `for', `while', or `until' loop

$ sed -e 's/sh/bash/' test.sh > test1.sh
$ chmod 777 test1.sh
$ ./test1.sh
b
./test1.sh: line 5: break: only meaningful in a `for', `while', or `until' loop

답변1

man페이지 에서 bash:

이름으로 bash를 호출하면, 기록 버전의 시작 동작을 모방하려고 시도합니다.POSIX 규격을 유지하면서 최대한 가깝습니다.

하지만 그렇게 말하면서,POSIX 정의of에는 블록 내에서의 사용이 break포함되지 않습니다 .case

man페이지에는 다음과 같은 내용도 나와 있습니다(의 정의에 따라 case).

만약에;;연산자를 사용하면 첫 번째 패턴 일치 이후 후속 일치가 더 이상 시도되지 않습니다.

그리고POSIX 정의말했다 case:

조건부 구성 사례는 다음에 해당하는 복합 목록을 실행해야 합니다.첫 번째여러 패턴

따라서 결론은 첫 번째 게임이 끝난 후 멈출 필요가 없다는 것입니다 break.case

답변2

Bash 매뉴얼 페이지에서:

bash가 sh 이름으로 호출되면 POSIX 표준을 준수하면서 sh의 이전 버전의 시작 동작을 최대한 가깝게 모방하려고 시도합니다.

breakC/C++와 달리 쉘 스크립트에서는 스위치/케이스 문을 사용할 필요가 없습니다 .

관련 정보