이 셸 스크립트를 파일에 저장했습니다. 이 스크립트는 몇 가지 기본적인 문자열 교체를 수행합니다.
#!/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
스위치 지원으로 --posix
POSIX와 더욱 호환됩니다. .sh
sh=배쉬?
오랫동안 대부분의 GNU/Linux 시스템을 /bin/sh
지칭하는 데 사용되었습니다 . /bin/bash
결과적으로 둘 사이의 차이점을 무시하는 것이 거의 안전합니다. 하지만 최근 들어 변화가 시작되었습니다.
시스템의 몇 가지 인기 있는 예 /bin/sh
( /bin/bash
일부는 /bin/bash
존재하지 않을 수도 있음)는 다음과 같습니다.
sh
최신 Debian 및 Ubuntu 시스템은 에 대한 기본 심볼릭 링크입니다dash
.- 바쁜 상자, 일반적으로 Linux 시스템 부팅 시간의 일부로 실행됩니다
initramfs
.ash
쉘을 사용하여 구현됩니다 . - BSD 및 일반적으로 Linux가 아닌 시스템. OpenBSD는
pdksh
Korn 쉘의 자손을 사용합니다. 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
다음과 같은 이유로 를 선호합니다.
- 그것은 표준화되어 있다
- 더 간단하고 배우기 쉬워요
bash
POSIX 시스템 간에 이식 가능 합니다 . 그렇지 않은 경우에도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