구문 상 유효한 bash 코드가 아닌 sh 코드가 있습니까? 유효 bash는 코드 (하지 않습니다

어떤 거기에 sh문법적으로 유효 bash는 코드 (하지 않습니다 발프 구문에 대한)없는 코드는?

나는 덮어 생각하고 sh함께 bash특정 명령에 대한.



답변

다음은 몇 가지 코드입니다. POSIX sh와 Bash에서 다른 기능 수행 .

hello &> world

그것이 당신에게 “유효하지 않은지”모르겠습니다.

Bash에서는 표준 출력과 표준 오류모두hello 파일로 리디렉션 합니다 world. POSIX에서는 백그라운드에서 sh실행 hello된 다음에 빈 리디렉션을 만들어 world잘라 & >냅니다 (예 :로 취급 ).

Bash 확장 프로그램이 실행될 때 다른 작업을 수행하는 다른 경우가 많이 bash있으며 순수한 POSIX에서 다른 영향을 미칩니다 sh. 예를 들어 중괄호 확장 은 또 다른 것이며 Bash의 POSIX 모드에서는 동일하게 작동하지만 그렇지 않습니다.


정적 구문 오류가 발생하는 한 Bash에는 POSIX에서 지정하지 않은 예약어 (예 : [[time)가 있습니다. 예를 들어 [[ x유효한 POSIX 셸 코드이지만 Bash 구문 오류이며 구문 오류 가 발생할 수있는 다양한 POSIX 비 호환 버그 의 이력 , 이 질문에서와 같은 :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

구문 오류 전용은 중요한 상황에 대해 “유효하지 않은”에 대한 매우 위험한 정의이지만 거기에 있습니다.


답변

간단한 예 :

time()(:)

timeBash는 예약어이며 time프로그램 과 다르게 동작 합니다. timebash를 사용하여 결과를 구문 분석하려고하는 실제 스크립트를 깨뜨릴 가능성이 큽니다 . 그러나 기술적으로는 구문 오류가 아닙니다. time함수로 재정의 하는 경우는 드물지만이 질문에 지정된대로 구문 오류가 발생합니다.

더 짧은 예 :

a():

에서 유효 dash하지만 POSIX 호환은 아닙니다.