Bash

Centos 8.4 POSIXLY_CORRECT 是什麼,是什麼讓它發生了變化?

  • June 20, 2021

我正在使用來自 github 的這個腳本進行測試:

https://github.com/rocky-linux/rocky-tools/blob/main/migrate2rocky/migrate2rocky.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 做了什麼以及為什麼它;昨天還不錯的時候現在出錯了。

如果您有任何疑問,請告訴我,我真的迷路了。

編輯:“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 ~]$

奇怪的是,正如您在上面看到的,當通過“bash”命令而不是我昨天所做的“sh”執行時,該命令有效。

該錯誤消息表明您沒有使用bash比 4.0 更新的 shell 版本執行它。據推測,該腳本依賴於bashshell 實現的特性,這些特性不同於或擴展了 Unix shell 語言的 POSIX 標準規定的特性集。

您的問題的結尾確認您使用 執行它sh,在您的系統上它可能是除bash. 即使你shbash偽裝的,它也會是在 POSIX 模式下執行的 shell。

考慮使用 執行腳本bash,或者,如果腳本#!在最頂部有一個 - 行,只需使腳本可執行(使用chmod +x scriptname),然後像執行它./scriptname

POSIXLY_CORRECT環境變數是一個變數,可幫助實用程序在工具實現不同於 POSIX 標準規定的行為時選擇行為。

shell 在 POSIX 模式下的bash行為會略有不同(即,如果set -o posix啟用,或者 shell 以 啟動sh)。差異在手冊中標題為“ Bash POSIX 模式”的部分中進行了描述bash

引用自:https://unix.stackexchange.com/questions/654350