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_VERSION
EUID
bash
sh
답변1
이 오류 메시지는 bash
버전 4.0보다 최신 셸 버전으로 실행하고 있지 않음을 나타냅니다. 아마도 스크립트는 bash
Unix 쉘 언어에 대한 POSIX 표준에 의해 지정된 기능 세트와 다르거나 확장된 쉘에 의해 구현된 기능에 의존할 것입니다.
질문의 끝 은 sh
. 위장 bash
하더라도 POSIX 모드로 실행되는 쉘이 됩니다.sh
bash
실행 스크립트 사용을 고려 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
"Bash-isms"는 쉘 특정 기능입니다. 배열이 좋은 예입니다. 쉘이 사용되는지 확인하려면 bash
두 가지 조건을 확인해야 합니다.
이 BASH_VERSION
변수는 쉘에 의해 설정된 특수 변수입니다 bash
. 다른 쉘에서는 이 변수를 설정하지 않으므로 단순히 정의되어 있는지 확인하는 것만으로도 충분합니다.
이 변수는 POSIX 모드라는 다른 모드에서 실행될 수 있기 POSIXLY_CORRECT
때문에 중요합니다 . bash
이 모드는 다른 쉘, 심지어 이전 쉘과의 호환성을 보장하기 위해 존재합니다. 이러한 호환성을 얻으려면 bash
일부 최신 기능을 끄십시오. 다시 말하지만, 이로 인해 스크립트가 중단되어 bash
POSIX 모드의 인스턴스에서 실행할 수 없습니다. 그렇기 때문에 검사가 취소됩니다. 즉, POSIXLY_CORRECT
설정하면 안 됩니다. bash
POSIX 모드에서 실행될 때 설정됩니다 .
질문에서 이미 지적했듯이 /bin/bash
예상대로 스크립트를 실행하면 BASH_VERSION
정의되었지만 POSIXLY_CORRECT
정의되지 않은 검사가 깔끔하게 통과됩니다.