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
2つの条件を確認する必要があります。
これBASH_VERSION
はシェルによって設定された特別な変数ですbash
。他のシェルではこの変数を設定しないので、単に定義されていることを確認するだけで十分です。
この変数は、POSIXモードと呼ばれる他のモードで実行できるPOSIXLY_CORRECT
ため、重要です。bash
このモードは、他のシェル、さらには古いシェルとの互換性を確保するために存在します。これらの互換性を得るために、bash
いくつかの最新の機能をオフにしてください。繰り返しますが、これはスクリプトを中断し、bash
POSIXモードのインスタンスで実行できません。そのため、検査はキャンセルされます。つまり、POSIXLY_CORRECT
設定しないでください。bash
POSIXモードで実行したときに設定されます。
質問ですでに指摘したように、期待/bin/bash
どおりにスクリプトを実行すると、定義されているが未定義のBASH_VERSION
チェックPOSIXLY_CORRECT
がきれいに渡されます。