
すべてのモジュールを記述する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
あなたはできます:
if ! ./install > "$install_log"; then
# ...
exit 1
fi
正確なエラーコードであるかどうかは重要ではありませんが、スクリプトの実行試行の一般的な成功または失敗のみがわかります。
- そうでなければ、他の人がコメントで提案したように、変数の内容を保存してから、
$?
可能な限り任意の方法で使用できます。
./install > "$install_log"
exit_code=$?
if [ $exit_code -eq 126 ]; then
# ...
exit 1
fi
さまざまな方法
ただし、質問自体へのアプローチを修正する必要があると思います。インストールスクリプトの文脈では、インストールを正常に実行する方が有利な場合があります。これはさまざまな方法で達成できます。特に次のようになります。
- Prependingで
chmod +x install
ファイルの実行ビットを設定します。インストールする:
chmod +x install
if ! ./install > "$install_log"; then
# ...
exit 1
fi
- スクリプトを渡して。 /インストールするユーザーシェルの引数として:
if ! "${SHELL:-/bin/bash}" ./install > "$install_log"; then
# ...
exit 1
fi
または直接必須/予想シェル:
if ! bash ./install > "$install_log"; then
# ...
exit 1
fi