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マニュアルです。

おすすめ記事