POSIXLY_CORRECT는 무엇이며 변경된 원인은 무엇입니까(Centos 8.4)?

POSIXLY_CORRECT는 무엇이며 변경된 원인은 무엇입니까(Centos 8.4)?

migrate2rocky.sh테스트를 위해 GitHub의 스크립트를 사용하고 있습니다 .

https://github.com/rocky-linux/rocky-tools/blob/main/ migration2rocky/ migration2rocky.sh

어제 이것을 테스트했는데 훌륭하게 작동합니다. 오늘은 스냅샷으로 돌아가서 다시 했습니다. 이번에는 첫 번째 확인에서 스크립트가 실패합니다.

if [ -n "$POSIXLY_CORRECT" ] || [ -z "$BASH_VERSION" ]; then
    printf '%s\n' "bash >= 4.0 is required for this script." >&2
    exit 1
fi

특히  $POSIXLY_CORRECT테스트에서는 실패했습니다(확인을 위해 코드 조각을 독립적으로 실행했습니다). 실행중인 bash 버전을 확인했습니다.

[user@server ~]$ rpm -qa | grep bash
bash-completion-2.7-5.el8.noarch
bash-4.4.20-1.el8_4.x86_64
[user@server ~]$ echo $BASH_VERSION
4.4.20(1)-release
[user@server ~]$ echo $POSIXLY_CORRECT

[user@server ~]$

내가 아는 한, POSIX는 UNIX 계열 운영 체제 간의 애플리케이션 이식성을 단순화하기 위해 설계된 표준 세트입니다.

우리 서버는 이 스크립트가 더 이상 작동하지 않는 이유를 설명하기 위해 어떠한 변경도 하지 않았습니다. 아직 사용하지 않은 서버에서 스크립트를 테스트했는데 동일한 문제가 발생했습니다.

서버는 모두 CentOS 8.4입니다.

무슨 일을 하는 지도 모르고 $POSIXLY_CORRECT어제는 잘 작동했는데 왜 지금은 잘못되었는지 모르겠습니다.

궁금한 점이 있으면 알려주세요. 정말 혼란스럽습니다.


명령 출력 sudo bash -x migrate2rocky.sh:

[user@server ~]$ sudo bash -x migrate2rocky.sh
+ '[' -n '' ']'
+ '[' -z '4.4.20(1)-release' ']'
+ ((  BASH_VERSINFO < 4  ))
+ ((  EUID != 0  ))
+ logfile=/var/log/migrate2rocky.log
+ truncate -s0 /var/log/migrate2rocky.log
+ exec
++ tee -a /var/log/migrate2rocky.log
++ tee -a /var/log/migrate2rocky.log
+ errcolor=
+ blue=
+ nocolor=
+ export LANG=en_US.UTF-8
+ LANG=en_US.UTF-8
+ shopt -s nullglob
+ SUPPORTED_MAJOR=8
+ SUPPORTED_PLATFORM=platform:el8
++ arch
+ ARCH=x86_64
+ gpg_key_url=https://dl.rockylinux.org/pub/rocky/RPM-GPG-KEY-rockyofficial
+ gpg_key_sha512=88fe66cf0a68648c2371120d56eb509835266d9efdf7c8b9ac8fc101bdf1f0e0197030d3ea65f4b5be89dc9d1ef08581adb068815c88d7b1dc40aa1c32990f6a
+ declare -A repo_urls
+ repo_urls=([rockybaseos]="https://dl.rockylinux.org/pub/rocky/${SUPPORTED_MAJOR}/BaseOS/$ARCH/os/" [rockyappstream]="https://dl.rockylinux.org/pub/rocky/${SUPPORTED_MAJOR}/AppStream/$ARCH/os/")
+ unset CDPATH
+ convert_info_dir=/root/convert
+ unset convert_to_rocky reinstall_all_rpms verify_all_rpms update_efi
+ noopts=0
+ getopts hrVR option
+ ((  ! noopts  ))
+ usage
+ printf '%s\n' 'Usage: migrate2rocky.sh [OPTIONS]' '' Options: '-h Display this help' '-r Convert to rocky' '-V Verify switch' '   !! USE WITH CAUTION !!'
Usage: migrate2rocky.sh [OPTIONS]

Options:
-h Display this help
-r Convert to rocky
-V Verify switch
   !! USE WITH CAUTION !!
+ exit 1
[user@server ~]$

이상하게도 위에서 볼 수 있듯이 어제 했던 것처럼 " " 대신 " " 명령을 실행할 때 명령이 작동합니다(테스트를 통과하고  합계 값을 POSIXLY_CORRECT계속 테스트합니다 ).BASH_VERSIONEUIDbashsh

답변1

이 오류 메시지는 bash버전 4.0보다 최신 셸 버전으로 실행하고 있지 않음을 나타냅니다. 아마도 스크립트는 bashUnix 쉘 언어에 대한 POSIX 표준에 의해 지정된 기능 세트와 다르거나 확장된 쉘에 의해 구현된 기능에 의존할 것입니다.

질문의 끝 은 sh. 위장 bash하더라도 POSIX 모드로 실행되는 쉘이 됩니다.shbash

실행 스크립트 사용을 고려 bash하거나 스크립트 #!맨 위에 - 줄이 있는 경우 스크립트를 실행 가능하게 만들고( 사용하여 ) 다음 chmod +x scriptname과 같이 실행합니다../scriptname

환경 POSIXLY_CORRECT변수는 도구의 구현된 동작이 POSIX 표준에 지정된 것과 다를 때 유틸리티가 동작을 선택하는 데 도움이 되는 변수입니다.

쉘은 bashPOSIX 모드에서 약간 다르게 동작합니다(즉, set -o posix활성화된 경우 또는 쉘이 시작된 경우 sh). 이러한 차이점은 다음 섹션에 설명되어 있습니다.배시 POSIX 모드" bash설명서에요.

답변2

Kusalananda의 답변에 몇 가지 상황별 세부정보를 추가하세요.

~에서연결된 Github URL, 스크립트의 첫 번째 줄은 #!/bin/bash스크립트에 사용되는 인터프리터(이 경우 bash셸)를 나타냅니다. 즉, 스크립트는 bash셸을 통해 실행되도록 되어 있습니다.

35행과 26행의 주석은 그 이유를 명확하게 보여줍니다.

# These checks need to be right at the top because we start with bash-isms right
# away in this script.

bash"Bash-isms"는 쉘 특정 기능입니다. 배열이 좋은 예입니다. 쉘이 사용되는지 확인하려면 bash두 가지 조건을 확인해야 합니다.

BASH_VERSION변수는 쉘에 의해 설정된 특수 변수입니다 bash. 다른 쉘에서는 이 변수를 설정하지 않으므로 단순히 정의되어 있는지 확인하는 것만으로도 충분합니다.

이 변수는 POSIX 모드라는 다른 모드에서 실행될 수 있기 POSIXLY_CORRECT때문에 중요합니다 . bash이 모드는 다른 쉘, 심지어 이전 쉘과의 호환성을 보장하기 위해 존재합니다. 이러한 호환성을 얻으려면 bash일부 최신 기능을 끄십시오. 다시 말하지만, 이로 인해 스크립트가 중단되어 bashPOSIX 모드의 인스턴스에서 실행할 수 없습니다. 그렇기 때문에 검사가 취소됩니다. 즉, POSIXLY_CORRECT설정하면 안 됩니다. bashPOSIX 모드에서 실행될 때 설정됩니다 .

질문에서 이미 지적했듯이 /bin/bash예상대로 스크립트를 실행하면 BASH_VERSION정의되었지만 POSIXLY_CORRECT정의되지 않은 검사가 깔끔하게 통과됩니다.

관련 정보