나는 일반적으로 쉘을 지칭하는 데 사용되는 "sh-호환"이라는 문구를 본 적이 있습니다. 쉘 내부에서 실행될 수 있는 프로그램에도 적용되는지는 확실하지 않습니다.
쉘이나 다른 프로그램이 "sh 호환"된다는 것은 무엇을 의미합니까? "sh 호환되지 않음"은 무엇을 의미합니까?
편집: bash와 sh의 차이점을 묻는 이 질문은 매우 관련이 있습니다. sh와 bash의 차이점
나는 여전히 "sh 호환"이 무엇을 의미하는지 직접적으로 대답하고 싶습니다. "sh 호환"은 "쉘 명령 언어 구현"을 의미한다고 합리적으로 예상할 수 있지만 "sh 호환" 쉘이 왜 그렇게 많고 서로 다른 이유는 무엇입니까?
답변1
"sh 호환" 쉘이 왜 그렇게 많습니까?
이것본 쉘1979년에 처음으로 공개적으로 출시되었습니다.유닉스 V7. 거의 모든 Unix 및 Unix 계열 시스템V7 유닉스에서- 비록 정신적으로라도 - Bourne 쉘은 우리와 "영원히" 함께 있었습니다.
Bourne 쉘은 실제로 이전 쉘을 대체하고 이름이 변경되었습니다.톰슨 쉘, 그러나 그것은 유닉스 역사 초기에 일어났기 때문에 오늘날 거의 잊혀지고 있습니다.Bourne 쉘은 Thompson 쉘의 상위 집합입니다..²
Bourne 쉘과 Thompson 쉘은 모두 sh
. 이것POSIX 지정 쉘또한 ~으로 알려진 sh
. 따라서 누군가 "호환 가능"이라고 말하면 sh
이 쉘 제품군을 의미합니다. 구체적으로 설명하고 싶다면 "POSIX 쉘" 또는 "Bourne 쉘"이라고 말할 것입니다.
버전 1988 기반 POSIX 셸강쉘컴퍼니, 이는 AT&T Unix의 Bourne 쉘을 대체하기 위한 것이었습니다.BSD C 쉘⁴ POSIX 셸의 조상에 관한 한 ksh
대부분의 Unix 및 Unix 계열 시스템에는 Korn 셸의 일부 변형이 포함되어 있습니다. 예외는 일반적으로 전체 POSIX 셸이 차지하는 공간을 감당할 수 없는 소형 임베디드 시스템입니다.
즉, POSIX 셸과 구별되는 Korn 셸은 상용 Unix 세계 외부에서 실제로 사용된 적이 없습니다. 왜냐하면 그 상승은 유닉스의 초기 상용화와 동시에 이루어졌기 때문이다.유닉스 전쟁. BSD Unix는 C 셸을 선호하여 이를 포기했으며 Linux가 처음 시작되었을 때 해당 소스 코드를 무료로 사용할 수 없었습니다. ⁵ 따라서 초기 Linux 배포자는 Linux 커널과 함께 사용할 명령 셸을 찾을 때 종종GNU 구타sh
, 당신이 말하는 호환 가능한 것 중 하나입니다. GNU Bash는 여러 면에서 POSIX를 능가하지만,보다 순수한 POSIX 모드에서 실행되도록 요구.
Linux와 Bash 간의 초기 연결로 인해 ksh
,csh
그리고tcsh
. Diehards는 오늘날에도 여전히 이러한 포탄을 사용하지만 소수에 속합니다. ⁶
이 모든 역사는 상대적으로 후발 창작자들이 bash
,zsh
, 그리고yash
호환 가능 하도록 선택 sh
: Bourne/POSIX 호환성은 Unix 계열 시스템의 셸이 널리 채택되기 위해 제공해야 하는 최소 수준입니다.
많은 시스템에서 기본 대화형 명령 셸 /bin/sh
은 뭔가 다릅니다. /bin/sh
아마도:
원래 Bourne 쉘.이는 Solaris 10(2005년 출시) 및 이전 버전과 같은 이전 UNIX® 시스템에서 일반적입니다. ⁸
POSIX 인증 쉘.이는 Solaris 11(2010)과 같은 최신 UNIX® 시스템에서 일반적입니다.
이것연금술 껍질. 이것은 오픈 소스 Bourne/POSIX 쉘 클론입니다.1989년 유즈넷에 처음 게시됨, 버클리에 기여중국남방연구그룹AT&T 소스 코드가 포함되지 않은 첫 번째 BSD 릴리스에 포함되었습니다.4.4BSD 라이트 버전.7 Almquist 쉘은 .dll
ash
로 설치된 경우에도 자주 호출됩니다/bin/sh
.ash
BSD 세계 외부에는 두 가지 중요한 분기가 있습니다:dash
,데비안과 우분투에서 널리 채택됨2006년에 기본으로 구현되었습니다/bin/sh
. (Bash는 여전히 기본값입니다.인터렉티브데비안 파생물의 명령 셸. )이것
ash
주문하다존재하다바쁜 상자, 임베디드 Linux에서 자주 사용되는 을 구현하는 데 사용할 수 있습니다/bin/sh
. 오래되고 낡았기dash
때문에데비안의 오래된ash
패키지, 명령 이름이 BusyBox에 있음에도 불구하고dash
대신 BusyBox의 파생물 로 처리하기로 결정했습니다 .ash
(BusyBox에는 시스템에서 항상 유사한 것은 아님 도대안풍부한-
ash
이라는 ).hush
ash
hush
/bin/sh
dash
GNU 구타, 어느호출 시 POSIX가 아닌 확장의 대부분을 비활성화합니다.
sh
.이 옵션은 Debian 및 그 파생 제품을 제외하고 Linux의 데스크톱 및 서버 변형에서 일반적입니다.
Apple이 Mac OS의 기본 설정을
tcsh
변경했습니다 . 다음 해 버전인 10.15(Catalina)가 되어서야 Bash에서 벗어났습니다. Bashzsh
는 여러 면에서 다르지만 광범위하게 POSIX와 호환되지 않았습니다.ksh93
POSIX 확장이 포함된 셸, 처럼오픈BSD에서. OpenBSD 쉘은 로 호출할 때 Bourne 및 POSIX 쉘과의 구문 및 의미론적 비호환성을 피하기 위해 동작을 변경하지만sh
순수 확장, 즉 이전 쉘과 충돌하지 않는 확장은 비활성화하지 않습니다.ksh93
이러한 상황은 흔하지 않습니다/bin/sh
.
위의 "쉘 스크립트"는 Bourne/POSIX 쉘 스크립트를 의미하는 일반적인 용어로 사용됩니다. 이는 Bourne 가족의 껍질이 어디에나 있기 때문입니다. 다른 쉘에서의 스크립팅에 대해 이야기하려면 "C 쉘 스크립트"와 같은 한정자를 제공해야 합니다. 이는 C 시리즈 셸이 기본 대화형 셸인 시스템에서도 마찬가지입니다.더 나은 것Bourne 쉘을 사용하여 스크립트를 작성하십시오.
위키피디아에서는 유닉스 쉘을 분류할 때 Bourne 쉘 호환, C 쉘 호환, "다른".
이 이미지가 도움이 될 수 있습니다.
(SVG 버전, 30kiB를 보려면 클릭하거나 보기를 클릭하세요.전체 크기 PNG 버전, 213KB. )
"sh 호환되지 않음"은 무엇을 의미합니까?
호환되지 않는 것에 대해 말하는 사람은 sh
일반적으로 다음 세 가지 중 하나를 의미합니다.
그들은 "다른" 껍질 중 하나를 언급하고 있었습니다. ⁹
그들은 Bourne 쉘 제품군과 C 쉘 제품군을 구별합니다.
그들은 다른 모든 Bourne 시리즈 쉘에서는 사용할 수 없는 하나의 Bourne 시리즈 쉘의 몇 가지 특정 기능에 대해 논의하고 있습니다.
ksh93
,bash
,zsh
특히 이전 "표준" 셸에는 존재하지 않는 많은 기능이 있습니다. 공유 POSIX/베이스를 넘어서면ksh88
세 가지가 여러 면에서 서로 호환되지 않습니다.
다음을 사용하여 쉘 스크립트를 작성하는 것은 일반적인 실수입니다.#!/bin/sh
셰르본 라인맨 위에는 Bash 또는 Korn 셸 확장을 사용하세요. 위에 표시된 Korn/POSIX 제품군의 쉘 중 하나가 이제 많은 시스템에서 실행 되므로 /bin/sh
이러한 스크립트는 작성된 시스템에서 실행되지만 /bin/sh
더 광범위한 Bourne 쉘 제품군의 시스템에서는 실패합니다. 스크립트에서 이러한 확장을 사용하는 경우 가장 좋은 방법은 #!/bin/bash
or shebang 줄을 사용하는 것입니다.#!/bin/ksh
특정 Bourne 시리즈 쉘 스크립트가 이식 가능한지 확인하는 방법에는 여러 가지가 있습니다.
지나가 다휴대용 케이스 프로그래밍의 장GNU Autoconf 매뉴얼. 스크립트에서 일부 문제가 있는 구성에 대해 이야기하고 있다는 것을 알 수 있습니다.
달리기
checkbashisms
스크립트 검사를 위한 데비안 프로젝트의 도구가 있습니다."바시즘".아래에서 실행해 보세요
posh
, 특별히 구현된 Debian 패키지 저장소의 쉘입니다.SUS3, 플러스다른 작은 기능들.obosh
아래에서 실행하세요.Healy 도구 프로젝트이는 2005년 Sun이 OpenSolaris의 일부로 오픈 소스로 제공한 Bourne 셸의 향상된 버전으로, 최신 컴퓨터에서 1979년 스타일의 Bourne 셸을 얻을 수 있는 가장 쉬운 방법 중 하나입니다.Schily Tools 배포판에는
bosh
POSIX 스타일 쉘 도 포함되어 있습니다.많은 비표준 기능, 그러나 이는 모든 POSIX 계열 쉘에서 실행되도록 설계된 쉘 스크립트의 호환성을 테스트하는 데 유용할 수 있습니다. 기능 세트는bash
및zsh
의 향상된 버전보다 더 보수적인 경향이 있습니다ksh93
.Schily Tools에는 다음과 같은 쉘
bsh
도 포함되어 있습니다.역사상 이상한 일들이것은 Bourne 가족의 껍질이 아닙니다.
왜 다른가요?
마찬가지로, "새롭거나 개선된 것"은 모두 다릅니다.
향상된 버전은 이전 버전과의 호환성을 깨뜨려야만 개선될 수 있습니다.
누군가는 자신이 선호하는 다른 작업 방식을 생각했지만 기존 작업 방식과 같지는 않았습니다.
누군가가 이전 표준을 완전히 이해하지 못한 채 다시 구현하려고 시도하여 의도하지 않은 차이가 발생하고 엉망이 되었습니다.
각주 및 해설:
BSD 유닉스의 초기 버전V6 Unix용 추가 소프트웨어 모음입니다. Bourne 쉘은 V7까지 AT&T Unix에 추가되지 않았기 때문에 BSD에는 기술적으로 처음부터 Bourne 쉘이 없었습니다. Thompson 쉘의 원시적 특성에 대한 BSD의 답변은 다음과 같습니다.C 쉘.
그럼에도 불구하고 BSD의 최초 독립 버전(2.9BSD 및 3BSD)은 V7 또는 그 휴대용 후속 버전을 기반으로 했기 때문에유닉스/32V, 그들을했다Bourne 쉘이 포함되어 있습니다.
(2BSD 라인은 디지털용 BSD의 병렬 포크가 되었습니다.플라즈마 미니컴퓨터3BSD 및 4BSD 시리즈는 다음과 같은 최신 컴퓨터 유형을 활용했습니다.왁스슨그리고유닉스 워크스테이션. 2.9BSD는 본질적으로 4.1cBSD의 PDP 버전입니다.그들은 동시대인이었고 코드를 공유했습니다.. VAX가 도착해도 PDP가 즉시 사라지지 않기 때문에 2BSD 라인은아직 흔들리는 ~을 따라.)
1983년에는 Bourne 쉘이 유닉스 세계 어디에나 존재했다고 해도 과언이 아닙니다. 이는 컴퓨팅 업계에서 "영원히"에 대한 좋은 근사치입니다.MS-DOS가 계층화된 파일 시스템을 갖게 된 해였습니다.(와, 너무 귀엽네요!) 첫 번째24비트 매킨토시말 그대로 회색조가 아닌 9인치 흑백 화면검은색그리고하얀색- 내년 초까지는 나오지 않을 것 같아요.
톰슨 쉘은꽤 독창적이다오늘날의 기준으로 보면. 그것은 오늘날 우리가 기대하는 스크립팅 프로그래밍 환경이 아니라 단지 대화형 명령 셸일 뿐입니다. 여기에는 "Unix 셸"의 원형 부분으로 간주되는 파이프 및 I/O 리디렉션과 같은 기능이 있으므로MS-DOS 명령 셸Unix에서 가져오는 것과 같습니다.
Bourne 쉘도 교체되었습니다.회로 기판 하우징
if
, 프로그래밍 가능성( ,switch
및while
) 및 초기 형태의 환경 변수 와 같은 중요한 사항을 Thompson 셸에 추가했습니다 . PWB 쉘은 모든 Unix 버전의 일부가 아니기 때문에 Thompson 쉘보다 덜 기억됩니다.누군가가 언제아니요특히 POSIX 및 Bourne 셸 호환성과 관련하여 이는 다양한 의미를 가질 수 있습니다.
극단적인 경우에는 1979년 Bourne 쉘을 기준으로 사용할 수도 있습니다. 이러한 의미에서 "
sh
호환 가능한 스크립트"는 실제 Bourne 쉘이나 그 후속작 및 복제물(ash
,bash
,ksh
,zsh
등 )에서 완벽하게 실행된다는 것을 의미합니다.다른 극단에는 POSIX 지정 쉘을 기준으로 가정하는 사람들이 있습니다. 요즘 우리는 너무 많은 POSIX 쉘 기능을 "표준"으로 간주하여 내장된 산술, 작업 제어, 명령 기록, 별칭, 명령줄 편집,
$()
명령 형식 대체 등 Bourne 쉘에 실제로 존재하지 않는다는 사실을 종종 잊어버립니다. , 등.Korn 셸의 역사는 1980년대 초로 거슬러 올라가지만 AT&T는 2017년까지 이를 Unix에 이식하지 않았습니다.시스템 V 버전 41988. 수많은 상용 Unix가 SVR4를 기반으로 하기 때문에
ksh
거의 모든 관련 상용 Unix는 1980년대 후반부터 SVR4를 채택했습니다.(몇 가지 이상한 유닉스 풍미를 기반으로 함)SVR3SVR4가 출시된 후 일찍부터 일부 시장을 점유했지만먼저 벽에 기대어언제혁명오는. )
1988년은 첫 해이기도 하다.POSIX 표준Korn 쉘을 기반으로 한 "POSIX 쉘"을 도입했습니다. 이후 1993년에는 Korn 쉘의 개선된 버전이 출시되었습니다. POSIX는 원래 버전을 효과적으로 굳혔기 때문에 두 가지 주요 버전, 즉 분할 연도의 이름을 딴 1과 2
ksh
로 분할되었습니다 .ksh88
ksh93
ksh88
차이는 작지만 POSIX와 완전히 호환되지 않으므로 일부 버전의ksh88
셸은 POSIX와 호환되도록 패치됩니다. (이것은Slashdot에서 David G. Korn 박사와의 흥미로운 인터뷰. 예, 쉘을 작성하는 사람입니다. )ksh93
예완벽하게 호환되는 POSIX 쉘의 상위 집합. 개발ksh93
은때때로 일어나는메인 소스 저장소가 AT&T에서 이전되었기 때문에GitHub로 이동이 글을 쓰고 있는 현재 최신 버전인 ksh93v가 출시된 지 약 3년이 되었습니다. (프로젝트의 기본 이름은 그대로 유지되며ksh93
1993년 이후 릴리스를 나타내기 위해 접미사가 추가됩니다.)Korn 쉘을 별도의 POSIX 쉘로 포함하는 시스템은 일반적으로 Korn 쉘을 제공
/bin/ksh
하지만 다른 곳에 숨겨져 있는 경우도 있습니다.ksh
Korn 셸의 이름 에 대해 이야기할 때 우리는ksh93
Bourne 및 POSIX 셸의 이전 버전과 호환되는 하위 집합과의 구별되는 특성에 대해 이야기하고 있습니다.ksh88
오늘날 순수한 사람들을 거의 만나지 못합니다.AT&T는 Korn 쉘 소스 코드를 독점적으로 보유하고 있습니다.2000년 3월까지. 그 당시 Linux는 GNU Bash와 매우 밀접하게 연결되어 있었습니다. 쿵하고
ksh93
모든 사람은 다른 사람보다 장점이 있습니다.그러나 이 시점에서는 관성이 Linux를 Bash와 밀접하게 연결했습니다.초기 Linux 공급업체가 GNU Bash를 가장 자주 선택한 이유는 다음과 같습니다.
pdksh
, 어느예전에는Linux가 막 시작되었을 때 사용 가능했는데, 이는 나머지 사용자 공간의 대부분도 Linux에서 제공되기 때문인 것 같습니다.GNU 프로젝트.pdksh
Bash 개발자는 Korn 쉘 기능을 복제하는 데만 국한되지 않기 때문에 Bash는 더욱 발전되었습니다 .pdksh
AT&T가 실제 Korn 쉘 소스 코드를 공개하자 작업이 중단되었습니다. 그러나 여전히 유지 관리되는 두 가지 주요 포크가 있습니다. OpenBSDpdksh
와MirBSD 코헨 쉘,mksh
.mksh
이것이 현재 Cygwin용으로 패키지된 유일한 Korn 쉘 구현이라는 점이 흥미로웠습니다 .csh
1990년대 초반에는 /가tcsh
BSD Unix의 기본 대화형 셸이었습니다.BSD 변종으로서, Mac OS X의 초기 버전은 Mac OS를 통해 이렇게 생겼습니다.10.2 "재규어". OS X는
tcsh
기본 쉘을 Bash에서 다음으로 전환합니다.OS X 10.3 "블랙 팬서". 이 변경 사항은 10.2 이하에서 업그레이드된 시스템에는 영향을 미치지 않습니다. 이러한 변환된 시스템의 기존 사용자는tcsh
쉘을 유지합니다.FreeBSD가
tcsh
기본 루트 쉘로 사용됨버전 14까지, 그러나 이제는 POSIX 호환 항목입니다.Almquist 케이스 변형. NetBSD에서도 마찬가지입니다.OpenBSD는 포크를
pdksh
기본 쉘로 사용합니다.4.4BSD-Lite는 모든 최신 BSD 파생물의 기초가 되었으며,
/bin/sh
대부분은 아래에 언급된 한 가지 주요 예외를 제외하고는 여전히 Almquist 파생물로 존재합니다. 소스 코드 저장소에서 이 직계 자손을 볼 수 있습니다.네트워크BSD그리고FreeBSD: 그들은 첫날부터 Almquist 쉘 파생 상품을 배송해 왔습니다./bin/sh
요즘에는 진정한 바닐라 Bourne 쉘을 갖춘 시스템을 찾기가 어렵습니다. 호환성 테스트를 위해 충분히 가까운 것을 찾으려면 많은 노력을 기울여야 합니다.나는 최신 컴퓨터에서 진정한 1979 빈티지 Bourne 쉘을 실행하는 단 한 가지 방법을 알고 있습니다.고대 유닉스 V7디스크 이미지와SIMH PDP-11 에뮬레이터~에서컴퓨터 역사 시뮬레이션 프로젝트. SIMH는 계속 실행됩니다.거의 모든 현대 컴퓨터, 유닉스 계열뿐만이 아닙니다.
그리고오픈 솔라리스,해Bourne Shell의 SVR4 버전은 처음으로 오픈 소스입니다. 이전에는 Bourne Shell의 V7 이후 버전에 대한 소스 코드는 Unix 소스 코드 라이센스가 있는 사용자만 사용할 수 있었습니다.
이제 이 코드는 존재하지 않는 OpenSolaris 프로젝트의 나머지 부분과 별도로 여러 다른 소스에서 사용할 수 있습니다.
가장 직접적인 출처는가보 Bourne 쉘 프로젝트. 2005년 OpenSolaris가 처음 출시된 직후에 사용할 수 있게 되었습니다. 다음 몇 달에 걸쳐 일부 이식성 및 버그 수정 작업이 완료되었지만 프로젝트 개발이 중단되었습니다.
obosh
Jörg Schilling은 다음 과 같이 이 코드의 버전을 유지하는 데 더 나은 작업을 수행했습니다.쉴리 도구팩. 이에 대한 자세한 내용은 위를 참조하세요.2005 소스 버전의 이러한 셸에는 다음이 포함되어 있습니다.멀티바이트 문자 집합지원, 직업 통제,쉘 기능, 그리고 1979년의 원래 Bourne 셸에는 없었던 기타 기능도 포함되어 있습니다.
원래 Bourne 쉘을 사용하고 있는지 확인하는 한 가지 방법은 Thompson 쉘에서 쉽게 변환하기 위해 추가된 문서화되지 않은 기능을 지원하는지 확인하는 것입니다 .
^
즉|
, Korn 또는 POSIX 유형 쉘에서 유사한 명령을 사용하면 다음과 같은ls ^ more
결과가 나타납니다. 오류이지만ls | more
실제 Bourne 쉘과 동일하게 작동합니다.가끔 당신은 만날 것입니다
fish
,scsh
또는rc/es
열렬한 팬이지만 C 쉘 팬보다 더 드뭅니다.쉘 제품군은
rc
Unix/Linux 시스템에서 일반적으로 사용되지 않지만 역사적으로 중요하므로 위 다이어그램에서 해당 위치를 차지합니다.rc
표준 쉘입니다벨 연구소 플랜 9운영체제, 일종의 후속작유닉스의 10번째 버전는 운영 체제 설계에 대한 Bell Labs의 지속적인 연구의 일환으로 만들어졌습니다. Bourne 및 C 쉘 모두와 프로그래밍 방식으로 호환되지 않습니다. 거기에는 교훈이 있습니다.
답변2
"sh 호환"이란 의미POSIXsh
, 모든 호환 시스템에 있어야 하는 기본 셸입니다. sh 호환 스크립트는 모든 POSIX 호환 시스템에서 실행되어야 합니다.
이렇게 말할 필요가 있는 이유는 일반적으로 /bin/sh
심볼릭 링크를 사용하면 일부 Bashism이 와 함께 사용된다고 선언하는 스크립트 /bin/bash
에 들어갈 수 있기 때문입니다 . 이러한 스크립트는 일부 상용 Unices를 포함하여 as를 사용하지 않는 시스템에서는 실행할 수 없습니다.sh
#!/bin/sh
bash
/bin/sh
더반그리고파생상품최근의.
특히 사용하는 경향이 있습니다.dash
Debian Almquish Shell sh
은 더 작고 빠르기 때문에 최근 기본값이 되었습니다. 이러한 경향은 sh
소위 대본이라 불리는 많은 것의 굴욕감을 강조합니다. "sh 호환"으로 설명하는 것은 해당 시스템 내에 완전히 남아 해당 시스템과 작동하도록 명시적으로 의도되었음을 나타냅니다.POSIX 특정 언어— 모든 셸은 이 기능의 상위 집합을 구현하므로 어디에서나 작동이 보장되지만 확장 기능은 서로 호환되지 않습니다.
다양한 셸은 고유한 역사를 갖고 있으며 사용자가 대화형으로 사용할 수 있도록 기능을 추가하거나 연관 배열과 같은 스크립팅 확장을 작성하는 등 시간이 지남에 따라 다양한 방향으로 발전해 왔습니다. "sh 비호환" 스크립트는 Bash의 조건문과 같은 비표준 확장 중 일부를 사용합니다 [[
.
bash
현재 쉘의 POSIX가 아닌 다른 모든 tcsh
기능zsh
유용한, 그리고 필요할 수 있는 상황이 많이 있습니다. 실행 중인 시스템의 기본 구현에서는 이러한 기능 /bin/sh
에 의존할 수 없기 때문에 사용 가능하다고 선언하는 스크립트에서는 사용하면 안 됩니다 .sh
연관 배열을 사용해야 하는 스크립트는 bash
대신 실행되도록 해야 합니다 sh
.
#!/bin/bash
declare -A array
이것은 어디에서나 적용됩니다 bash
. 확장 기능이 필요하지 않고 이식 가능한 스크립트는 sh
기본 셸 명령 언어를 사용하고 이를 고수한다고 선언해야 합니다.