オプション1
$?
bash 変数を使用して、スクリプトから実行された何かの戻りコードを確認できます。
moo@cow:~$ false
moo@cow:~$ echo $?
1
moo@cow:~$ true
moo@cow:~$ echo $?
0
オプション 2
if
このようにコマンドをステートメントに直接入れて、戻りコードを確認することもできます。
moo@cow:~$ if echo a < bad_command; then echo "success"; else echo "fail"; fi
fail
戻りコードを反転する
コマンドのリターン コードは、文字で反転できます!
。
moo@cow:~$ if ! echo a < bad_command; then echo "success"; else echo "fail"; fi
success
スクリプト例
楽しみのために、あなたの質問に基づいてこのスクリプトを書くことにしました。
#!/bin/bash
_installed=()
do_rollback() {
echo "rolling back..."
for i in "${_installed[@]}"; do
echo "removing $i"
rm -rf "$i"
done
}
install_pkg() {
local _src_dir="$1"
local _install_dir="$2"
local _prev_dir="$PWD"
local _res=0
# Switch to source directory
cd "$_src_dir"
# Try configuring
if ! ./configure --prefix "$_install_dir"; then
echo "error: could not configure pkg in $_src_dir"
do_rollback
exit 1
fi
# Try making
if ! make; then
echo "error: could not make pkg in $_src_dir"
do_rollback
exit 1
fi
# Try installing
if ! make install; then
echo "error: could not install pkg from $_src_dir"
do_rollback
exit 1
fi
# Update installed array
echo "installed pkg from $_src_dir"
_installed=("${_installed[@]}" "$_install_dir")
# Restore previous directory
cd "$_prev_dir"
}
install_pkg /my/source/directory1 /opt/install/dir1
install_pkg /my/source/directory2 /opt/install/dir2
install_pkg /my/source/directory3 /opt/install/dir3