Bash >=4.0을 어떻게 감지할 수 있나요?

Bash >=4.0을 어떻게 감지할 수 있나요?

를 사용하는 스크립트를 작성 중이므로 read -iBash 4.0 이상이 필요합니다.

불행하게도 2020년 초 현재 macOS에는 여전히 Bash 3.x가 함께 제공되며 내 스크립트의 많은 사용자는 Mac을 사용하게 될 것입니다. Apple이 기본 셸을 zsh로 변경했기 때문에 번들 버전이 업데이트될 것이라는 희망은 없습니다.

따라서 나는 내 스크립트가 Bash가 충분히 새로운지 여부를 감지하고 사용자에게 업그레이드를 지시하는 유용한 오류 메시지와 함께 종료되기를 원합니다.

비교할 수 있다는 것을 알고 있지만 ${BASH_VERSION}이는 숫자가 아니고 잠재적으로 신뢰할 수 없는 형식의 문자열입니다. 그것에 대해 가정을 하는 것은 취약하다고 느껴집니다.

이를 달성하는 가장 좋은 방법은 무엇입니까?

requireBash4() {
  if <something here>; then
    >&2 echo "Bash 4.0 or newer is required."
    >&2 echo "Once you're upgraded, re-run this script."
    exit 1
  fi
}

답변1

if ((BASH_VERSINFO >= 4)); then ...

BASH_VERSINFO배열이라는 점에 유의하세요 . Bash의 모든 배열과 마찬가지로 이를 일반 변수로 사용하면 0번째 요소를 참조합니다. ((BASH_VERSINFO[0] >= 4))더 명확하다고 생각되면 사용할 수도 있습니다 .

그리고 그렇습니다. 이 변수와 구문은 최소한 bash 2.0부터 지원됩니다.

BASH_VERSINFO

이 bash 인스턴스에 대한 버전 정보를 보유하는 멤버가 있는 읽기 전용 배열 변수입니다. 배열 멤버에 할당된 값은 다음과 같습니다.

BASH_VERSINFO[0] 주 버전 번호(릴리스)입니다.
BASH_VERSINFO[1] 부 버전 번호(버전)입니다.
BASH_VERSINFO[2] 패치 수준입니다.
BASH_VERSINFO[3] 빌드 버전입니다.
BASH_VERSINFO[4] 릴리스 상태(예: 베타1)입니다.
BASH_VERSINFO[5] 의 가치 MACHTYPE.

관련 정보