가장 이식성이 뛰어난 셸은 무엇이며 따라야 할 관련 모범 사례는 무엇입니까? [폐쇄]

가장 이식성이 뛰어난 셸은 무엇이며 따라야 할 관련 모범 사례는 무엇입니까? [폐쇄]

나는 몇 달 동안 쉘 스크립팅을 해왔고 내가 작성한 코드가 bash일부 컴퓨터에서는 작동하지 않는다는 것을 발견했습니다. 이것은 매우 실망스럽습니다.

공부해야 한다는 걸 깨달았어요최대대신 휴대용 쉘 스크립트입니다. 물론 처음에는 조금 힘들겠지만 결국에는 보상을 받을 것이라고 확신합니다. 나는 내 쉘 스크립트가 Linux 제품군과 BSD 제품군을 포함하여 거의 모든 곳에서 실행되기를 원합니다. (그러나 Windows에서 실행되는지는 상관하지 않습니다.)

질문

  1. 가장 휴대성이 좋은 케이스는 무엇인가요?편집: 이 질문을 무시하십시오

  2. 가장 휴대성이 뛰어난 쉘을 사용할 때의 심각한 단점은 무엇입니까?편집: 이 질문을 무시하십시오

  3. 이식성이 뛰어난 코드를 작성하려면 또 무엇에 주의해야 합니까? 예를 들어 어떤 core-utils와 어떤 버전을 사용하고 피해야 합니까?

답변1

이름 참조( ), 연관 배열( ) 또는 macOS의 기본값을 사용하려고 시도하는 등 다른 시스템의 셸 버전에 너무 새로운 기능을 사용하지 않는 한 셸이 설치된 모든 컴퓨터에서 스크립트를 실행 해야 bash합니다 . 형식(또는 다른 형식)(이것은 오래된 것입니다. 이 경우 Homebrew를 사용하여 최신 버전을 설치하면 됩니다). 다른 시스템에서 사용할 수 없는 외부 도구나 구현되지 않거나 다르게 구현될 수 있는 도구 기능을 사용하는 경우에도 스크립트가 실패할 수 있습니다.bashbashdeclare -ndeclare -A%(...)Tprintfbashbash

POSIX 시스템에서 가장 이식성이 뛰어난 쉘 언어는 sh쉘입니다. 여기에 설명되어 있습니다.https://pubs.opengroup.org/onlinepubs/9699919799/idx/shell.html

확장 기능을 갖춘 쉘 bash(및 기타)이 구현되었습니다 sh. 다음 과 같은fish 일부 껍질zshshzshsh--emulate shdash 하다좀 더 순수하게 POSIX 표준을 따르십시오 sh(그러나 여전히 일부 확장이 포함되어 있음).

일반적으로 말하면, 다음과 관련된 쉘 측면은통사론그리고내장된 기능스크립트가 항상 동일한 셸(및 어느 정도 셸 버전)에 의해 실행되는 한, 해당 셸이 셸이더라도 "이식 가능"해야 합니다 fish. 이는 Python, Perl 및 Ruby 스크립트와 동일한 유형의 "이식성"을 갖습니다. 그러나 일반적으로 에서 실행 되거나 "호환성 모드"의 일부 형식으로 실행되는 사용 sh가능한 셸(일반적으로 로 설치 ) 이 있어야 합니다 ./bin/shbashdashksh

POSIX 시스템에서 가장 이식성이 뛰어난 유틸리티는 POSIX 유틸리티입니다. 이에 대한 설명은 다음과 같습니다.https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

GNU Utilities의 유틸리티인 GNU Utilities는 coreutilsPOSIX 유틸리티를 구현합니다(schily 사용자로)댓글로 지적해, POSIX-라는 의미는 아닙니다.합법적으로) 그런 다음 주로 편의를 위해 기능을 확장합니다. 다른 Unix 시스템의 해당 유틸리티도 마찬가지입니다. 또한 Linux의 GNU 패키지에는 coreutilsPOSIX에서 지정한 모든 유틸리티가 포함되어 있지 않으며, find, sed등 의 awk유틸리티 는 POSIX 유틸리티이며 별도로 패키지되어 있습니다.

POSIX 유틸리티를 계속 사용하고 POSIX 동작(옵션 등의 측면에서)을 사용하는 한 POSIX sh구문을 사용하는 스크립트의 대부분의 Unix 시스템에서 "대부분 이식 가능"할 것입니다. 그러나 POSIX 유틸리티가 아닌 유틸리티도 있고 POSIX 유틸리티에 대한 POSIX가 아닌 확장도 여전히 존재합니다.상당히일반적으로 구현되므로 이식 가능합니다. POSIX가 아닌 일반적인 유틸리티의 예로는 pkill, tar및 가 있습니다 gzip. 일반적인 POSIX 유틸리티에 대한 비 POSIX 확장의 예는 일반적으로 이해되는 -iname술어 find와 사실입니다.sed확장하다정규식 사용법 -E.

어떤 확장이 어떤 도구의 구현, 어떤 Unices에서, 어떤 방식으로 사용되는지 직접 테스트하고(예: 가상 머신에서) 이 사이트의 질문과 답변을 읽어보면 배울 수 있습니다. 예를 들어,sed -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?

또한 POSIX 표준이 "지정되지 않은" 동작을 유지하는 경우도 있습니다. 이는 POSIX 옵션을 사용하는 동일한 유틸리티가 서로 다른 두 Unix 시스템에서 다르게 동작할 수 있음을 의미합니다. 예는 여기에서 찾을 수 있습니다.권한이 괜찮은데 심볼릭 링크를 새 대상으로 업데이트할 때 권한이 거부되는 이유는 무엇입니까?

이것피해순수 POSIX 쉘 코드를 작성하려고 할 때의 가장 큰 단점은 정말 유용한 기능을 놓친다는 것입니다. 나는 한때 findGNU의 조건자 테스트에 대해 POSIX 동등한 테스트를 작성 하려고 시도했지만 -readable쉽지 않았으며 이름 대신 ps및를 사용하여 프로세스를 표현하려는 것이 이 사이트에서 너무 많은 질문의 주제였습니다. 마찬가지로 "POSIX를 유지"하려면 POSIX를 멀리해야 합니다.greppkill정말 유용한 것들와 마찬가지로 perl대부분의 관리 작업(사용자 추가, 백업 관리, 시스템 간 파일 전송 등)을 이식 가능한 방식으로 수행할 수 없습니다.

일반적으로 말하면 나는 하나를 선호합니다바쁜다른 시스템을 지원하기 위해 내 코드를 수정해야 할 수도 있다는 점을 이해하면서 작업을 완료하는 방법(다른 시스템에서 사용되는 경우)순수주의자방법. 그렇다고 해서 이식성 문제가 가능한 한 적은 스크립트를 작성하는 것을 막지는 못합니다(어디서나 이식 불가능한 의미론을 사용하지 않을 것입니다). 그러나 이것은 내 개인적인 의견입니다.

답변2

요점은POSIX이런 것들을 표준화하기 위해

  1. bash는 좋지만 POSIX 하위 집합을 사용합니다.
  2. 효율성이 좀 떨어지겠죠
  3. POSIX 사양의 나머지 부분을 읽고 여기와 다음과 같은 다른 곳에서 시간을 보내십시오.뉴스 그룹

답변3

GNU/Linux 시스템에서 이식 가능한 스크립트를 작성하려는 경우 가장 좋은 옵션은 쉘을 사용하는 것입니다 dash. 이것은 표준 이상의 추가 기능을 거의 제공하지 않는 매우 휴대성이 뛰어난 쉘입니다. 이는 /bin/shDebian 및 Ubuntu 시스템의 표준입니다. Red Hat과 CentOS는 bash를 운영 체제로 사용하므로 /bin/sh이식성 테스트에 적합하지 않습니다.

답변4

귀하의 질문이 잘못된 것 같습니다.

올바른 질문은 다음과 같습니다."이식 가능한 스크립트를 얻으려면 어떻게 해야 하나요?"

주요 이식성 문제는 향상된 기능을 구현하는 프로그램과 이를 사용하는 사용자 사이에 있습니다. 이러한 향상된 기능은 다른 UNIX 플랫폼에서 누락될 가능성이 높기 때문입니다.

다음은 이식성 문제의 일반적인 원인 목록입니다.

  • GNU 스타일의 긴 옵션으로 광고되는 GNU 프로그램은 --long100% 이식 불가능합니다. 이식 가능한 스크립트에서는 절대로 사용하지 마십시오.

  • 배쉬 구현KSH 스타일향상된 기능(예: ) [[ -z $HOME ]]이것은 POSIX에는 없는 기능이며 ksh88, ksh93, bash, mksh만 구현합니다.

  • bash(Mac OS 및 Solaris에서 사용되는 컴파일 옵션으로 컴파일되지 않은 경우)는 echoUNIX 동작과 충돌하는 비 POSIX 내장 명령을 구현합니다. 주의하세요. 또한 다음 사항도 참고하세요.

  • printf일부 구현은 문자열 인수의 nul 바이트를 올바르게 처리하지 못하고, 다른 printf 구현은 다른 기능 세트를 갖기 때문에 Printf도 최종 솔루션이 아닙니다 .

  • 1, 2, 3, 6, 9, 14, 15 이외의 신호 번호는 이식할 수 없습니다. 관련 신호는 UNIX 버전에 따라 이름/번호 매핑이 다릅니다.

  • POSIX 쉘 수학 등은 echo $(( a + b ))쉘마다 지원되는 기능 세트가 다르기 때문에 이식성 문제를 일으킬 수 있습니다. POSIX에는 제한된 기능 세트만 필요합니다.

  • POSIX 쉘은 일반적으로아니요/bin/shPOSIX는 경로 이름이 존재하지 않는 한 경로 이름을 처리하지 않기 때문입니다 dev/tty. POSIX 셸을 시작하려면 호출하여 getconf PATH결과를 PATH셸로 사용한 다음 입력하면 shPOSIX 셸이 생성됩니다.

  • /bin일반적 으로 기대되는 다른 모든 유틸리티도 /usr/bin유틸리티의 POSIX 변형이 아닙니다. 다음으로 전화해야 합니다.

    PATH=`getconf PATH`
    export PATH
    sh
    

    유틸리티의 POSIX 변형을 호출하는 POSIX 셸을 가져옵니다.

많은 사람들이 테스트용으로 권장 하지만 멀티바이트 문자 지원을 구현하지 않아 POSIX를 인식하지 못하기 때문에 dash문제가 됩니다 .dash

내가 추천하는 것은 기본적으로 켜져 있는 최소한의 POSIX 기능을 구현하는 데 pbosh이를 사용하는 것입니다 .boshpbosh

관련 정보