리소스가 rpm
파일 인 거대한 프로그램을 설치하고 있습니다. 그것은 라인에 붙어
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
분명히이 구문으로 Red Hat Linux에서 sh
작동 bash
하지만 unexpected operator
우분투 에서 오류가 발생 합니다.
bash
스크립트가 rpm
패키지 에서 제공 되므로 스크립트를 변경할 수 없습니다 . rpm
패키지를 추출하여 재 포장 할 수 있지만 이러한 스크립트가 많이있을 수 있습니다.
치료에 쉘 기본값을 변경하는 방법이 있나요 #!/bin/sh
으로 bash
핸들 할 수있는, 또는 다른 어떤 [
운전자는?
답변
의 언어를 구현하는 여러 프로그램이 있습니다 /bin/sh
. 우분투에서 /bin/sh
대시는 빠르도록 설계되었으며 소량의 메모리를 사용하며에서 예상되는 최소값 이상을 지원하지 않습니다 /bin/sh
. RHEL에서 /bin/sh
bash는 더 느리고 더 많은 메모리를 사용하지만 더 많은 기능이 있습니다. 이러한 기능 중 하나는 조건부 구문 의 ==
연산자입니다 [
. Dash는 [
기본 sh 기능인을 지원하지만 ==
bash (및 ksh 및 zsh) 확장자 인 연산자 는 없습니다 .
bash를 사용하여 시스템을 전환 할 수 있습니다. 우분투에서는 /bin/sh
에 대한 심볼릭 링크 dash
입니다. bash
대신 심볼릭 링크로 만들 수 있습니다 . 데비안과 우분투 (및 파생 제품)의 현재 버전은이를 대시의 설치 옵션으로 만듭니다. 변경하려면 다음을 실행하십시오.
sudo dpkg-reconfigure dash
대시를 그대로 유지하려면 “yes”, /bin/sh
bash로 전환하려면 “no” 로 응답하십시오 .
bash를로 유지할 수 /bin/sh
있지만 시스템 속도가 약간 느려집니다. 일부 시스템 스크립트는 bash와 호환되지 않는 것으로 생각할 수 있지만 bash는 대부분 수퍼 세트이기 때문에 가능성이 낮습니다.
구현 중 선택할 인터페이스가없는 배포의 /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
/bin/bash
배포에서 sh가 기본적으로 사용 되는 경우 , bash에는 대시보다 많은 기능이 있기 때문에 대시로 전환하면 스크립트가 실패 할 수 있습니다. Bash 스크립트는로 시작해야하며으로 시작하는 스크립트는 bash 특정 기능을 사용하지 말고 bash #!/bin/bash
와 함께 #!/bin/sh
제공되는 배포는 해당 배포와 /bin/sh
관련된 #!/bin/sh
스크립트 에서 bash 특정 기능을 사용할 수 있습니다 (사용자가 기대하지 않는 한 괜찮습니다) 대시로 전환 할 수 있으며 /bin/sh
이러한 스크립트가 다른 배포판에서 작동 할 것으로 예상되지 않습니다).
답변
전환하기 sh
로 bash
(대신 dash
, 기본값), 재구성이 dash
(예, 그것은 다소 반 직관적이다) :
sudo dpkg-reconfigure dash
dash
기본 시스템 쉘 이 될 것인지 묻습니다 . “아니오”라고 답한 Tab다음 ( Enter) bash
대신 기본값이됩니다 ( 즉, /bin/sh
을 가리킴 /bin/bash
).