거대한 프로그램을 설치 중인데 해당 리소스가 rpm
파일입니다. 그건 줄에 붙어있어
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
분명히 이 구문을 사용하면 Red Hat Linux에서는 작동 sh
하지만 Ubuntu에서는 오류가 발생합니다 bash
.unexpected operator
bash
스크립트가 rpm
패키지 에서 제공되기 때문에 스크립트를 변경할 수 없습니다 . 패키지 를 추출해서 다시 패키징할 수도 rpm
있지만 아마 이런 스크립트가 많을 겁니다.
연산자를 처리할 수 있는 다른 것으로 #!/bin/sh
처리 하도록 쉘 기본값을 변경하는 방법이 있습니까 ?bash
[
답변1
Ubuntu 22.04(및 Debian 11)까지는 재구성을 통해 ( 기본값 대신 ) sh
전환 할 수 있습니다 (예, 이는 다소 직관에 어긋납니다).bash
dash
dash
sudo dpkg-reconfigure dash
dash
기본 시스템 쉘로 설정할지 묻는 메시지가 표시됩니다 . "아니요"라고 대답하면( Tab그런 다음 Enter) bash
기본 시스템 쉘이 됩니다(즉 /bin/sh
)을 가리킬 것이다 /bin/bash
.
Ubuntu 22.10 및 Debian 12부터 이 기능은 더 이상 지원되지 않습니다. /bin/sh
이 기능으로 전환하려면 /bin/bash
수동으로 심볼릭 링크를 걸어야 합니다 . 바라보다자일스의 대답더 알아보기.
답변2
이를 구현하는 여러 프로그램이 있습니다 /bin/sh
. Ubuntu에서는 /bin/sh
속도가 빠르고 적은 양의 메모리를 사용하도록 설계되었으며 /bin/sh
RHEL에서는 /bin/sh
더 느리고 더 많은 메모리를 사용하는 bash입니다 . 더 많은 기능. 이러한 기능 중 하나는 조건 구문 ==
연산자 입니다 [
. Dash는 [
기본 sh 기능인 이를 지원 하지만 ==
bash(및 ksh 및 zsh) 확장 연산자로는 제공되지 않습니다.
bash를 사용하도록 시스템을 전환할 수 있습니다. 우분투에서는 /bin/sh
이것을 가리켜 dash
심볼릭 링크로 만들 수 있습니다 bash
. Debian 및 Ubuntu(및 그 파생 버전)의 현재 버전에서는 Dash를 설치 옵션으로 제공합니다. 변경하려면 다음을 실행하세요.
sudo dpkg-reconfigure dash
대시를 유지하려면 "예"라고 대답하고 /bin/sh
bash로 전환하려면 "아니요"라고 대답하세요.
bash를 그대로 놔둘 수 있지만 /bin/sh
그렇게 하면 시스템이 약간 느려질 것입니다. 일부 시스템 스크립트가 bash와 호환되지 않을 수도 있지만 bash는 주로 dash의 상위 집합이기 때문에 그럴 가능성은 없습니다.
구현 중에서 선택할 수 있는 인터페이스가 없는 배포판의 경우 /bin/sh
bash로 전환하는 방법은 다음과 같습니다.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
터미널을 열어두고 sh
나중에 일부 스크립트를 계속 실행할 수 있는지 확인하세요. 이 명령을 엉망으로 만들면 시스템을 사용할 수 없게 됩니다. (그런데 제가 위에서 간단한 명령 대신 여러 명령을 사용한 이유는 sudo ln -sf bash /bin/sh
이것이 원자적이지 않기 때문입니다 ln -sf
. 이 작업 중에 컴퓨터가 충돌할 가능성은 거의 없지만 복구 미디어에서 명령을 다운로드하여 복원해야 합니다. 그것은 mv
원자적이다).
대시를 복원하려면 다음을 수행하십시오 /bin/sh
.
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh
배포판이 기본적으로 sh를 사용하는 경우 /bin/bash
bash에는 대시보다 더 많은 기능이 있으므로 대시로 전환하면 스크립트가 실패할 수 있습니다. Bash 스크립트는 로 시작해야 하며 #!/bin/bash
, 로 시작하는 스크립트는 #!/bin/sh
bash 관련 기능을 사용해서는 안 됩니다. 그러나 bash와 함께 제공되는 배포판은 /bin/sh
해당 배포판과 관련된 스크립트에서 bash 특정 기능을 사용할 수 있습니다 #!/bin/sh
(사용자가 기대하지 않는 한). 대시로 전환하고 /bin/sh
이러한 스크립트가 다른 배포판에서 작동하는 것을 원하지 않음).