구문적으로 유효한 bash 코드가 아닌 sh 코드가 있습니까?

구문적으로 유효한 bash 코드가 아닌 sh 코드가 있습니까?

sh구문상 유효한 bash 코드가 아닌 코드가 있습니까 (구문을 포기하지 않고)?

몇 가지 명령 sh으로 재정의하려고 생각 중입니다 .bash

답변1

여기 몇 가지 코드가 있습니다뭔가 다른 일을 해라POSIX sh 및 Bash에서:

hello &> world

이것이 당신에게 "작동하지 않는" 것인지 모르겠습니다.

배쉬에서는표준 출력 및 표준 오류 리디렉션에서 hello파일을 입력하세요 world. POSIX에서는 백그라운드에서 실행된 다음 null 리디렉션을 수행하여 sh이를 자릅니다(즉, 그렇게 처리됩니다 ).helloworld& >

Bash 확장이 런타임에 작동 bash하고 순수 POSIX에서 다른 효과를 갖는 다른 경우도 많이 있습니다 sh. 예를 들어,버팀대 확장Bash의 POSIX 모드에서도 실행되는 또 다른 모드이지만 그렇지 않습니다.


정적 구문 오류 측면에서 Bash에는 [[및 와 같은 POSIX 지정되지 않은 예약어가 있습니다. 예를 들어 이것은 유효한 POSIX 쉘 코드이지만 Bash 구문 오류 및 다양한 기록이 있습니다.time[[ xPOSIX 비호환성 오류로 인해 이 질문과 같은 구문 오류가 발생할 수 있습니다.:

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

단순한 구문 오류는 중요한 상황에서 "잘못된"이라는 매우 위험한 정의이지만 존재합니다.

답변2

간단한 예:

time()(:)

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

더 짧은 예:

a():

에서는 유효 dash하지만 POSIX와 호환되지 않습니다.

관련 정보