우분투에서 sh를 위해 Bash를 사용하는 방법


13

리소스가 rpm파일 인 거대한 프로그램을 설치하고 있습니다. 그것은 라인에 붙어

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

분명히이 구문으로 Red Hat Linux에서 sh작동 bash하지만 unexpected operator우분투 에서 오류가 발생 합니다.

bash스크립트가 rpm패키지 에서 제공 되므로 스크립트를 변경할 수 없습니다 . rpm패키지를 추출하여 재 포장 할 수 있지만 이러한 스크립트가 많이있을 수 있습니다.

치료에 쉘 기본값을 변경하는 방법이 있나요 #!/bin/sh으로 bash핸들 할 수있는, 또는 다른 어떤 [운전자는?


5
유일한 잘못은 ==이어야한다는 것 =입니다. 그리고 변수 확장은 큰 따옴표로 묶어야합니다.
Kusalananda

4
[연산자가 아니라 내장 명령입니다 test. 예기치 않은 연산자는 POSIX 호환이 아니므 ==로이 연산자 로 대체해야합니다 =.
schily

두 번째로 잘못된 것은 $SCITEGICPERLHOME인용해야한다는 것입니다.
l0b0

12
프로그램 작성자에게 불만을 제기해야합니다. 사용하는 경우 확장이 #!/bin/sh아닌 POSIX 셸 기능 만 사용해야 bash합니다. 이 프로그래머는 매우 조잡합니다. 그는 자신의 코드를 수정하거나 사용해야 #!/bin/bash합니다.
Barmar

다른 유사한 문제에 대해 궁금해하는 사람들을위한 " Bashisms " 목록이 있습니다. 이 질문 도 참조하십시오 .
캡틴 맨

답변:


21

의 언어를 구현하는 여러 프로그램이 있습니다 /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이러한 스크립트가 다른 배포판에서 작동 할 것으로 예상되지 않습니다).


내 겸손하지 않은 견해로 /bin/sh는 Bash 일 때 일부 스크립트가 실패하면 시스템 (스크립트가있는 패키지) 또는 Bash sh모드 에서 버그 입니다. Stephen이 말했듯이 시스템 /bin/sh은를 통해 Bash로 다시 설정할 수 있습니다 dpkg-reconfigure. 또한 우분투 위키에서이 문제에 대한 가능성으로 언급되었습니다 : wiki.ubuntu.com/DashAsBinSh
ilkkachu

5
@ilkkachu 네, 만약 스크립트 /bin/sh가 bash 라면 실패한다면 그것은 버그입니다. 그러나 버그가 발생합니다. 다른 사람들이 당신을 위해 그것을 테스트했기 때문에 그러한 버그를 진단하고 기꺼이 진단 할 수 없다면 기본값을 고수하는 것이 좋습니다. 나는 /bin/sh데비안에서 공식적으로 지원되기 전에 대시를 사용 했지만, 어떤 일이 발생하면 대처할 수 있다는 것을 알고 위험을 감수했습니다.
Gilles 'SO- 악마 중지'

수동으로 재정의 된 심볼릭 링크는 debconf다음 dash에 업데이트 될 때 저장된 구성으로 복원 됩니다. 틀림없이 이것은 데비안이 안정된 시스템에서 자주 발생하지 않을 것입니다.
Stephen Kitt

36

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

sudo dpkg-reconfigure dash

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


1
귀하의 솔루션은 실제로 가장 합리적인 솔루션이지만 문제를 설명하는 자세한 설명으로 인해 다른 답변을 수락했습니다. 불편을 끼쳐 드려 죄송합니다.
Googlebot

@Googlebot은 사과 할 필요가 없습니다. 승인 된 답변을 선택하는 것이 asker의 특권입니다. 그리고 나는 그것에서 금 배지를 얻었습니다 ;-).
Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.