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

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

거대한 프로그램을 설치 중인데 해당 리소스가 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전환 할 수 있습니다 (예, 이는 다소 직관에 어긋납니다).bashdashdash

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/shRHEL에서는 /bin/sh더 느리고 더 많은 메모리를 사용하는 bash입니다 . 더 많은 기능. 이러한 기능 중 하나는 조건 구문 ==연산자 입니다 [. Dash는 [기본 sh 기능인 이를 지원 하지만 ==bash(및 ksh 및 zsh) 확장 연산자로는 제공되지 않습니다.

bash를 사용하도록 시스템을 전환할 수 있습니다. 우분투에서는 /bin/sh이것을 가리켜 dash심볼릭 링크로 만들 수 있습니다 bash. Debian 및 Ubuntu(및 그 파생 버전)의 현재 버전에서는 Dash를 설치 옵션으로 제공합니다. 변경하려면 다음을 실행하세요.

sudo dpkg-reconfigure dash

대시를 유지하려면 "예"라고 대답하고 /bin/shbash로 전환하려면 "아니요"라고 대답하세요.

bash를 그대로 놔둘 수 있지만 /bin/sh그렇게 하면 시스템이 약간 느려질 것입니다. 일부 시스템 스크립트가 bash와 호환되지 않을 수도 있지만 bash는 주로 dash의 상위 집합이기 때문에 그럴 가능성은 없습니다.


구현 중에서 선택할 수 있는 인터페이스가 없는 배포판의 경우 /bin/shbash로 전환하는 방법은 다음과 같습니다.

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/bashbash에는 대시보다 더 많은 기능이 있으므로 대시로 전환하면 스크립트가 실패할 수 있습니다. Bash 스크립트는 로 시작해야 하며 #!/bin/bash, 로 시작하는 스크립트는 #!/bin/shbash 관련 기능을 사용해서는 안 됩니다. 그러나 bash와 함께 제공되는 배포판은 /bin/sh해당 배포판과 관련된 스크립트에서 bash 특정 기능을 사용할 수 있습니다 #!/bin/sh(사용자가 기대하지 않는 한). 대시로 전환하고 /bin/sh이러한 스크립트가 다른 배포판에서 작동하는 것을 원하지 않음).

관련 정보