スクリプトの権限エラーを正しく処理します。

スクリプトの権限エラーを正しく処理します。

すべてのモジュールを記述するJSONファイルに基づいて複数のモジュールをインストールするスクリプトがあります。

各モジュールを繰り返しながらインストールスクリプトを呼び出します。

# Create install log destination
install_log=install_log/`date -Iseconds | awk -F '+' '{print $1}'`".log"
echo -e "To monitor installation:\ntail -f `pwd`/$install_log"
# Install
./install > $install_log                # <- This file sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    echo -e "\n"
    cat $install_log | tail -n 35
    echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n~~~ Install of module $module_name failed ~~~\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"
    exit 1;
fi

installスクリプトにxビットがない場合、許可エラーメッセージが表示されます。ただし、$?エラー条件はテストでは検出されず、スクリプトは続行されます。

このような場合は、どのようにスクリプトを停止しますか?

ベストアンサー1

リテラルソリューション

変える

./install > $install_log # <- This line sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    # ...
    exit 1;
fi

あなたはできます:

  1. 終了ステータス 0 が成功を示す一般的なルールを活用し、if条件付き構造そして!予約語:
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi

正確なエラーコードであるかどうかは重要ではありませんが、スクリプトの実行試行の一般的な成功または失敗のみがわかります。

  1. そうでなければ、他の人がコメントで提案したように、変数の内容を保存してから、$?可能な限り任意の方法で使用できます。
./install > "$install_log"
exit_code=$?
if [ $exit_code -eq 126 ]; then
    # ...
    exit 1
fi

さまざまな方法

ただし、質問自体へのアプローチを修正する必要があると思います。インストールスクリプトの文脈では、インストールを正常に実行する方が有利な場合があります。これはさまざまな方法で達成できます。特に次のようになります。

  1. Prependingでchmod +x installファイルの実行ビットを設定します。インストールする:
chmod +x install
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi
  1. スクリプトを渡して。 /インストールするユーザーシェルの引数として:
if ! "${SHELL:-/bin/bash}" ./install > "$install_log"; then
    # ...
    exit 1
fi

または直接必須/予想シェル:

if ! bash ./install > "$install_log"; then
    # ...
    exit 1
fi

おすすめ記事