POSIXLY_CORRECT는 무엇이며 무엇이 변경됩니까(Centos 8.4)?

POSIXLY_CORRECT는 무엇이며 무엇이 변경됩니까(Centos 8.4)?

migrate2rocky.shGitHub의 스크립트를 사용하여 테스트하고 있습니다 .

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 계열 OS 간의 애플리케이션 이식성을 용이하게 하기 위한 표준 세트입니다.

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

서버는 모두 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. sh변장 한 경우에도 bashPOSIX 모드에서 실행되는 셸이 됩니다.

를 사용하여 스크립트를 실행하는 것을 고려하십시오 bash. 또는 스크립트 #!맨 위에 -라인이 있는 경우 스크립트를 실행 가능하게 만들고( 를 사용하여 chmod +x scriptname) 처럼 실행하십시오 ./scriptname.

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

bash은 POSIX 모드에서 약간 다르게 작동합니다(즉, 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-isms'는 쉘에 특정한 기능입니다 bash. 배열이 이에 대한 좋은 예입니다. 쉘이 사용되는지 확인하기 위해 bash두 가지 조건을 확인합니다.

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

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

질문에서 이미 언급했듯이 /bin/bash의도한 대로 스크립트를 실행하면 검사가 깔끔하게 통과 BASH_VERSION됩니다 POSIXLY_CORRECT.

관련 정보