추가 읽기

추가 읽기

내가 본 대부분의 쉘 스크립트(직접 작성하지 않은 스크립트 제외)에서 shebang이 #!/bin/sh. 도 존재합니다.

이것이 거의 어디에나 있고 많은 Linux 및 BSD 시스템에서 기본값으로 사용되는 경우가 많기 때문에 /bin/sh이를 선호할 이유가 있습니까 ?/bin/bashbash

답변1

  1. 일부 시스템은 기본적으로 bash를 제공하지 않습니다(예: FreeBSD).
  2. bash가 설치되어 있어도 .bash에 위치하지 않을 수 있습니다 /bin.
  3. 대부분의 간단한 스크립트에는 bash가 필요하지 않습니다.
  4. POSIX 셸을 사용하면 이식성이 더 뛰어나고 스크립트는 더 다양한 시스템에서 실행될 수 있습니다.

답변2

Linux(Debian 관련: Ubuntu, Mint 등)의 대부분의 시스템 스크립트는 이러한 시스템의 기본 /bin/sh인 더 빠른 대시에서 실행되도록 작성되었습니다. 두 가지 이유가 있습니다:

  • 시스템 속도. 대시 코드가 작을수록 더 빠르게 로드되고 더 빠르게 실행됩니다. 쉘 스크립트 프로그래머 측에서는 약간의 (작은?) 추가 노력(비용)이 필요합니다.

  • 안전. 다양한 껍질은 벌레를 예방하는 데 도움이 됩니다. 데비안 시스템은 기본 쉘에는 그러한 취약점이 없기 때문에 대부분 쉘쇼크에 취약하지 않습니다.

Bash는 실제로 기본 쉘입니다사용자, 더 강력하고 코딩을 더 쉽게 만드는 요소가 더 많기 때문입니다. 이는 shMac OS의 기본값이기도 합니다(/bin/sh에서 연결됨). 그러나 bash링크 이름으로 호출하면 shposix 호환 쉘로 시작됩니다.

답변3

다른 사람들은 이 질문의 전제가 Bourne Again 쉘이 기본이고 어디에나 존재한다는 것이며 이는 완전히 거짓이라고 지적했습니다.

그 외에도 쉘 스크립트를 해석하기 위해 Bourne Again 쉘 이외의 도구를 사용하는 데는 좋은 이유가 있습니다. 이러한 이유로 인해 대규모 Ubuntu 및 Debian 프로젝트는 bashism을 제거하고 시스템 초기화로 실행되는 가능한 한 많은 쉘 스크립트를 만들기 위해 수년 동안 노력했습니다.많은시스템 5 쉘 스크립트 rc) 및 패키지 설치/제거를 사용하여데비안 Almquist 쉘Bourne Again 쉘 대신.

간단히 말해서 Bourne Again 쉘은 대화형 기능으로 가득 차 있지만 POSIX 호환 쉘 스크립트에 대한 가장 빠른 쉘 해석기는 아닙니다. 따라서 쉘 스크립트를 POSIX와 호환되게 만들고 더 가벼운 프로그램(예: Debian Almquist 쉘)을 사용하여 이를 해석할 수 있다면 시스템 성능이 더 좋아질 것입니다. (결국 데비안은 너무 깊이 내장되어 있고 너무 광범위하며 제거하기에는 너무 유용한 POSIX가 아닌 여러 쉘 구성에 대한 지원을 추가하기 위해 Almquist 쉘을 약간 조정해야 했습니다.)

이 모든 결과로 부팅 성능이 크게 향상되었습니다.

따라서 고려해야 할 두 가지 유형의 쉘이 있습니다.

  • 모든 멋진 대화형 기능을 갖춘 쉘은 다음과 같이 구성됩니다.대화형 로그인 셸계정 데이터베이스의 사용자용입니다.
  • 많은 수의 스크립트를 빠르게 해석하는 쉘로, 다음과 같이 사용됩니다.스크립트 인터프리터쉘 스크립트를 통해.

이것을 "선호 /bin/sh"라고 부르는 것은 지나치게 단순화된 것입니다. 데비안은 실제로 적어도표적:

  1. Debian Almquist 쉘, Z 쉘(POSIX 모드), Bourne Again 쉘(POSIX 모드), MirBSD Korn 쉘 및 기타 쉘을 사용하는 관리자에게는 /bin/sh두 가지 옵션이 있습니다:

    1. /bin/sh... 매핑 대상을 전환해도 문제가 발생하지 않도록 스크립트를 가능한 한 이식 가능하게 만듭니다 .

    2. ...이식성이 없는 스크립트를 명시적으로 위치 지정올바른 통역사/bin/sh, 단순히 매핑을 기대하는 것이 아니라 .

  2. /bin/shBourne Shell 대신 Debian Almquist 쉘을 기본 매핑으로 만들어 해당 스크립트가POSIX 준수(또는 더 정확하게는 Debian 정책 매뉴얼 준수)가 더 빠르게 실행됩니다.

물론 일단 현장에 들어가면 훨씬 더 멀리 갈 수 있습니다. 예를 들어 쉘 스크립트나 컴파일된 프로그램 등의 효율성 균형을 고려하십시오 /bin/true. /usr/bin/clear그러나 다행히도 이는 이 답변의 범위를 벗어납니다. ☺

물론, 이 중 어느 것도 새로운 것이 아니며 심지어 Unix에만 국한된 것도 아닙니다. 세기가 바뀌기 오래 전에 나는 "대화형"과 "비대화형" 특성을 모두 갖춘 명령줄 해석기를 작성하여 출시했으며, doco에서 이러한 구분을 설명하고 변수 간의 COMSPEC환경 OS2_SHELL차이를 기록했습니다. 마찬가지로 Debian System V에서 bashism과 패키지 설치/제거 스크립트를 제거하는 것에 대한 논의는 rc1990년대로 거슬러 올라갑니다.

추가 읽기

답변4

더 강력하고 인체공학적인 언어로 스크립트 대신 쉘 스크립트를 작성해야 하는 유일한 이유는 다음과 같습니다.알 수 없는 소프트웨어 세트가 설치된 레거시 시스템으로의 이식성은 다른 어떤 요소보다 중요합니다..

/bin/sh이는 자신을 Unix라고 부르는 모든 사용자가 사용할 수 있는 유일한 스크립트 해석기입니다. 그러나 다수의 레거시 시스템에서 /bin/sh관련 유틸리티는 최신 사양은 물론 POSIX.1-1996 "쉘 및 유틸리티" 사양도 준수하지 않습니다. 호환 도구는 /usr/xpg4눈에 띄지 않는 위치에 설치되는 선택적 추가 기능입니다 . 1이식 가능한 하위 집합 쉘 언어로 스크립트를 작성하는 것은 POSIX 쉘 언어로 스크립트를 작성하는 것보다 더 지루하고 오류가 발생하기 쉽습니다. (내 말을 믿을 수 없다면 configureAutoconf가 생성한 스크립트를 가끔 읽어 보십시오. 설정만으로도 충분히 납득할 수 있습니다.)

하지만 가정할 수 있다면다른 스크립트 인터프리터설치된 경우(예: Bash) 통역사를 사용할 수 있습니다.더 나은 스크립팅 언어설치되었습니다. 예를 들어 펄은아마도 Bash보다 더 유용할 것입니다.

그러므로 당신은안 돼요스크립팅 #! /bin/bash. ​​그것이 옵션이라면 더 나은 언어도 옵션이기 때문입니다.

1 예를 들어 Solaris 10 및 이전 버전에서는오리지널 Bourne 쉘처럼 /bin/sh. Solaris 11에서 ksh93으로 업데이트했다는 것을 알게 되었습니다.

관련 정보