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 계열 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_VERSION
EUID
bash
sh
답변1
bash
오류 메시지는 릴리스 4.0보다 최신 셸 릴리스로 실행하지 않았음을 나타냅니다 . 아마도 스크립트는 bash
Unix 쉘 언어에 대한 POSIX 표준이 규정하는 기능 세트와 다르거나 확장하는 쉘이 구현하는 기능에 의존할 것입니다.
질문의 끝 부분에서는 를 사용하여 실행했음을 확인합니다 sh
. 시스템에서는 가 아닌 다른 쉘일 수 있습니다 bash
. sh
변장 한 경우에도 bash
POSIX 모드에서 실행되는 셸이 됩니다.
를 사용하여 스크립트를 실행하는 것을 고려하십시오 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
여러 가지 최신 기능을 끄십시오. 다시 말하지만, 이로 인해 스크립트가 중단되므로 bash
POSIX 모드의 인스턴스에서 스크립트를 실행할 수 없습니다. 이것이 검사가 반전되는 이유이며, POSIXLY_CORRECT
설정해서는 안 되는 것입니다. bash
POSIX 모드에서 실행될 때 설정됩니다 .
질문에서 이미 언급했듯이 /bin/bash
의도한 대로 스크립트를 실행하면 검사가 깔끔하게 통과 BASH_VERSION
됩니다 POSIXLY_CORRECT
.