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


31

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

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


1
나는 구문 적으로 유효한 것을 의미한다고 생각한다. 그래서 그것은 구문에 바르지 않을 것이다
Alexander Mills

2
다른 토큰 화? 예를 들어 ((떠오른다.
ccorn

1
일부 배포판 /usr/bin/sh/usr/bin/bashCentOS 7.3을 사용하고 있습니다. 당신 sh은 정말로 bash당신의 배포판 인지 확인해야 합니다.
Centimane

1
몇 년 전 배쉬에서 무언가가 "업그레이드"되었을 때 프로젝트 전체가 중단되었습니다. 모든 세방 라인을에서 (으) #!/bin/sh로 변경해야 했습니다 #!/bin/bash. 그런 다음 모든 것이 다시 작동하므로 실제로주의해야합니다. sh에 대해 bash 대신 dash를 사용하기 시작했을 때 발생했을 수 있습니다.
Joe

1
@Joe, 그것은 OP가 요구하는 것과 반대입니다 .sh 코드로 잘못 레이블이 지정되었지만 그렇지 않은 bash 코드가 있습니다. OP는 bash와 함께 실행될 때 깨지는 bash 코드를 가질 수 있는지 (실제로 잘못 레이블이 지정되지 않은) sh 코드를 가질 수 있는지 묻습니다. 사용 가능한 언어 기능에 영향을 미치며 확장 기능이 아닙니다).
Charles Duffy

답변:


49

다음은 몇 가지 코드입니다. 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

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


3
중괄호 확장은 현재 bash (및 zsh, pdksh, ksh93)를 비준수로 만드는 반면 POSIX는 중괄호 확장 (및 {fd}>file유사한 문제) 을 허용하기 위해 사양에서 프로비저닝을 추가 하는 중입니다. 지정되지 않은 상태로 유지되지만 호환되는 스크립트는 출력 echo "{a,b}"을 원할 때 수행해야합니다 {a,b}. 시작된 토론
Stéphane Chazelas


2
POSIX에서 스크립트를 작성하는 사람이 이와 같은 명령을 작성 했습니까? OP는 sh에서 bash로 가고 있으며 내 이해에서 이것은 다른 방향으로 나아가는 데 더 문제가있는 것처럼 보입니다.
Rich

1
@Rich : 물론입니다. 나는 /bin/shbash 인 시스템을 사용하지 않으므로이 bashism을 적극적으로 인식하지 못하면 명령 줄을 작성하면 쉽게 발생할 수 있습니다. 대답의 간격은 거의 보이지 않지만 hello&>world덜 가져옵니다.
R ..

2
지난 달 &>차이 로 인해 실제로 버그를 보았습니다 !
Gordon Davisson

16

간단한 예 :

time()(:)

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

더 짧은 예 :

a():

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


3
더 일반적으로, 비표준 키워드 또는 Bash의 내장 명령 인 단어는 동일한 효과를 발생시킵니다. 뿐만 아니라 time, 물건 같은있다 declare, function, select,와 coproc. 그중 일부는 표준 ( 키워드내장 / 유틸리티 ) 에서 명시 적으로 지정되지 않았지만 예를 들어 time또는 coproc목록에서 볼 수는 없습니다 . 그리고 사용하는 --posix것이 도움이되지 않는 것 같습니다.
ilkkachu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.