단일 또는 이중 스탠드 및 휴대성

단일 또는 이중 스탠드 및 휴대성

[여기서 "if" 문 사이 의 [[차이점에 대한 정말 좋은 답변을 찾았습니다 . 특정 명명된 쉘의 경우 [[over를 사용하는 것이 좋은 생각인 것 같습니다 [(또한 더 빠릅니다).

그러나 이식성에 대해서는 아직 불분명합니다. 내 목표가 POSIX 호환 셸용 스크립트를 작성하는 것이라면 #!/bin/sh이 구문이 허용하는 정도를 허용하는 스크립트로 스크립트를 시작할 것입니다. 내가 아는 한, 이중 괄호는 POSIX 표준에는 없지만 "실제 세계"에서는 이것이 얼마나 큰 문제입니까?

내 말은 이식 가능하지만 2000-2005년의 모든 실행 가능한 POSIX 쉘에서 실행하기에 충분할 만큼 좋은 스크립트를 원한다는 것입니다. 이는 이것이 표준의 일부가 아니라는 것을 의미합니다. 이는 사실이지만 실제로 2005년 이후의 모든 쉘은 거의 확실하게 이 구문을 허용합니다.

또한 스크립트 이식성과 POSIX에 대한 보다 일반적인 질문이 있습니다. 다른 작성자는 이 문제에 어떻게 접근합니까? 사용 사례와 대상 고객이 대부분의 결정을 내린다는 것을 이해합니다. 하지만 인터넷 전반에 걸쳐 발생할 수 있는 비호환성을 줄이기 위해 가능한 한 POSIX에 가깝게 유지하려고 노력하고 있습니까, 아니면 대부분의 쉘이 아직 지원하지 않는 모든 장점을 활용하고 있습니까? POSIX 표준의 경우?

나는 먼저 대부분의 스크립트를 Bourne 및 POSIX와 호환되도록 만들려고 노력합니다. 그러나 시간이 지나면서 더 많은 Bash 문서를 읽고 온라인에서 다른 사람의 스크립트를 살펴보면서 이러한 추가 기능을 활용하면 스크립트를 더 쉽게 읽을 수 있고 많은 경우 더 작아질 수 있다고 말씀드리고 싶습니다.

답변1

내 목표가 POSIX 호환 셸용 스크립트를 작성하는 것이라면 #!/bin/sh로 스크립트를 시작하겠습니다. [[이 구문이 얼마나 허용적인지 알 수 있습니다.

별말씀을요. 많은 최신 Linux 기반 시스템에서는dash기본적으로 /bin/sh이것은 완전히POSIX 호환더 이상 없으므로 [[작동하지 않습니다. 여기에는 최근의 모든더반그리고우분투분포와 그 파생물 및 기타 많은 분포. 역사적으로 이러한 시스템은 종종 Bash를 대신 사용하여 성능 향상을 위해 의도적으로 전환했습니다.

대부분의 BSD 및 대부분의 상용 Unices를 포함한 많은 다른 시스템은 이를 지원하지 않으며, [[결코 지원하지 않습니다. shPOSIX만 지원하거나 해당 확장에 구문이 포함되지 않습니다 [[.오픈BSDshBash의 버전과 약간 다른 버전을 지원 하지만 [[, 다른 사람이 이 작업을 수행하는 경우는 없습니다. 그렇지 않으면 Bash를 사용하는 시스템 /bin/sh(또는 덜 자주 다른 시스템)만이 스크립트 로 선언된 작업을 zsh수행할 수 있습니다 .[[sh


반면 실제로 대부분의 시스템에는 Bash가 설치되어 있으며 bash모든 시스템에서 스크립트를 명시적으로 실행하는 것만으로도 충분합니다. 어쨌든 Bash의 sh에뮬레이션 모드는 항상 손상되었습니다 .

당신은 Bash 기능에 의존하고 있기 때문에 그것을 스크립트로 선언하려는 이유가 전혀 없습니다 sh. 그냥 말하고 #!/bin/bash완료하십시오.[[원하는 대로 수행하거나 완전히 제외하는 것이 더 좋습니다 [. 최대의 이식성을 원한다면 를 사용하십시오.[또는testPOSIX sh1 을 사용 하고 주의 깊게 작성하세요.

1 일부 상업용 Unices에는 POSIX가 아닌 구현이 있거나 있었습니다 . Unices가 작동하려면 POSIX 시스템에 대한 전체 경로를 사용하여 스크립트를 실행해야 합니다 .sh/bin/shsh

관련 정보