sh는 무엇입니까?

sh는 무엇입니까?

이 셸 스크립트를 파일에 저장했습니다. 이 스크립트는 몇 가지 기본적인 문자열 교체를 수행합니다.

#!/bin/sh
html_file=$1
echo "html_file = $html_file"
substr=.pdf
pdf_file="${html_file/.html/.pdf}"
echo "pdf_file = $pdf_file"

이것을 명령줄에 붙여 넣으면 정상적으로 작동합니다.

$ html_file="/home/max/for_pauld/test_no_base64.html"
  echo "html_file = $html_file"
  substr=.pdf
  pdf_file="${html_file/.html/.pdf}"
  echo "pdf_file = $pdf_file"

주어진

html_file = /home/max/for_pauld/test_no_base64.html
pdf_file = /home/max/for_pauld/test_no_base64.pdf

위의 echo 출력은 다음과 같습니다. 예상대로 작동합니다.

그러나 스크립트를 호출하면

$ saucer "/home/max/for_pauld/test_no_base64.html"

나는 다음과 같은 결과를 얻습니다.

html_file = /home/max/for_pauld/test_no_base64.html
/home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution

내 스크립트가 다른 버전의 bash나 다른 것을 사용합니까? Shebang 라인을 변경해야 합니까?

답변1

sh는 무엇입니까?

sh(또는 Shell Command Language)은 다음에 의해 개발된 프로그래밍 언어입니다.POSIX 표준. 많은 구현이 있습니다( ksh88, dash, ...). bash구현으로 간주될 수도 있습니다 sh(아래 참조).

sh이는 구현이 아닌 사양이기 때문에 /bin/sh대부분의 POSIX 시스템에서 심볼릭 링크(또는 하드 링크)의 실제 구현입니다.

배쉬가 뭐야?

bash원래는 호환성 구현을 위해 의도되었지만 sh(POSIX 표준보다 몇 년 앞서 있음에도 불구하고) 시간이 지남에 따라 많은 확장이 이루어졌습니다. 이러한 확장 중 다수는 유효한 POSIX 쉘 스크립트의 동작을 변경할 수 있으므로 bash그 자체로는 유효한 POSIX 쉘이 아닙니다. 대신 POSIX 쉘 언어의 방언입니다.

bash스위치 지원으로 --posixPOSIX와 더욱 호환됩니다. .sh

sh=배쉬?

오랫동안 대부분의 GNU/Linux 시스템을 /bin/sh지칭하는 데 사용되었습니다 . /bin/bash결과적으로 둘 사이의 차이점을 무시하는 것이 거의 안전합니다. 하지만 최근 들어 변화가 시작되었습니다.

시스템의 몇 가지 인기 있는 예 /bin/sh( /bin/bash일부는 /bin/bash존재하지 않을 수도 있음)는 다음과 같습니다.

  1. sh최신 Debian 및 Ubuntu 시스템은 에 대한 기본 심볼릭 링크입니다 dash.
  2. 바쁜 상자, 일반적으로 Linux 시스템 부팅 시간의 일부로 실행됩니다 initramfs. ash쉘을 사용하여 구현됩니다 .
  3. BSD 및 일반적으로 Linux가 아닌 시스템. OpenBSD는 pdkshKorn 쉘의 자손을 사용합니다. FreeBSD는 sh원래 UNIX Bourne 쉘의 자손입니다. Solaris에는 자체 시스템이 있지만 sh오랫동안 POSIX와 호환되지 않았습니다.가보 프로젝트.

/bin/sh내 시스템에 어떤 문제가 있는지 어떻게 알 수 있나요 ?

문제는 이것이 /bin/sh심볼릭 링크일 수도 있고 하드 링크일 수도 있다는 것입니다. 심볼릭 링크인 경우,가지고 다닐 수 있는해결책은 다음과 같습니다.

% file -h /bin/sh
/bin/sh: symbolic link to bash

하드링크라면 시도해 보세요

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

실제로 이 -L플래그는 하드 링크뿐만 아니라 심볼릭 링크도 포함하지만 이 접근 방식의 단점은 이식성이 없다는 것입니다. - POSIX불필요한 find-samefile옵션은 지원되지만 둘 다GNU 찾기그리고FreeBSD 찾기그것을 지원하십시오.

셰르본 라인

궁극적으로 "shebang" 줄을 작성하여 어느 것을 사용할지 결정합니다.

예를 들어

#!/bin/sh

sh(및 그것이 가리키는 것이 무엇이든) 사용할 것입니다 .

#!/bin/bash

/bin/bash사용 가능한 경우 사용합니다. 그렇지 않은 경우 오류 메시지와 함께 실패합니다. 물론 다음과 같은 다른 구현을 지정할 수도 있습니다.

#!/bin/dash

어느 것을 사용할 것인가

내 스크립트의 경우 sh다음과 같은 이유로 를 선호합니다.

  • 그것은 표준화되어 있다
  • 더 간단하고 배우기 쉬워요
  • bashPOSIX 시스템 간에 이식 가능 합니다 . 그렇지 않은 경우에도sh

bash사용하면 장점도 있습니다. 그 기능은 프로그래밍을 더 편리하게 만들고 다른 현대 프로그래밍 언어로 프로그래밍하는 것과 유사하게 만듭니다. 여기에는 범위가 지정된 지역 변수 및 배열 등이 포함됩니다. Plain sh은 매우 미니멀한 프로그래밍 언어입니다.

답변2

@Hunter.S.Thompson의 탁월한 답변 외에도 스크립트의 이식 불가능한 부분은 다음과 같습니다.

pdf_file="${html_file/.html/.pdf}"

이것은 ${variable/search/replace}GNU 확장입니다. 그러나 순수 POSIX를 사용하면 이를 쉽게 피할 수 있습니다.

pdf_file="${html_file%.html}".pdf

Hunter에 이어 이것은 Shebang을 다음으로 변경하는 것보다 더 나은 솔루션입니다.#! /bin/bash

관련 정보