우분투에서 sh를 위해 Bash를 사용하는 방법 [ $SCITEGICPERLHOME == “.”

리소스가 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/shbash는 더 느리고 더 많은 메모리를 사용하지만 더 많은 기능이 있습니다. 이러한 기능 중 하나는 조건부 구문 의 ==연산자입니다 [. Dash는 [기본 sh 기능인을 지원하지만 ==bash (및 ksh 및 zsh) 확장자 인 연산자 는 없습니다 .

bash를 사용하여 시스템을 전환 할 수 있습니다. 우분투에서는 /bin/sh에 대한 심볼릭 링크 dash입니다. bash대신 심볼릭 링크로 만들 수 있습니다 . 데비안과 우분투 (및 파생 제품)의 현재 버전은이를 대시의 설치 옵션으로 만듭니다. 변경하려면 다음을 실행하십시오.

sudo dpkg-reconfigure dash

대시를 그대로 유지하려면 “yes”, /bin/shbash로 전환하려면 “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이러한 스크립트가 다른 배포판에서 작동 할 것으로 예상되지 않습니다).


답변

전환하기 shbash(대신 dash, 기본값), 재구성이 dash(예, 그것은 다소 반 직관적이다) :

sudo dpkg-reconfigure dash

dash기본 시스템 쉘 이 될 것인지 묻습니다 . “아니오”라고 답한 Tab다음 ( Enter) bash대신 기본값이됩니다 ( 즉, /bin/sh 을 가리킴 /bin/bash).