次のスクリプトを作成しました。
# !/bin/bash
# OUTPUT-COLORING
red='\e[0;31m'
green='\e[0;32m'
NC='\e[0m' # No Color
# FUNCTIONS
# directoryExists - Does the directory exist?
function directoryExists {
cd $1
if [ $? = 0 ]
then
echo -e "${green}$1${NC}"
else
echo -e "${red}$1${NC}"
fi
}
# EXE
directoryExists "~/foobar"
directoryExists "/www/html/drupal"
スクリプトは機能しますが、エコーに加えて次の出力が表示されます。
cd $1
実行に失敗しました。
testscripts//test_labo3: line 11: cd: ~/foobar: No such file or directory
これをキャッチすることは可能ですか?
ベストアンサー1
エラー終了モードを設定するために使用されますset -e
。単純なコマンドがゼロ以外の状態(失敗を示す)を返すと、シェルは終了します。
これがset -e
常に動作するわけではありません。テスト場所のコマンドは失敗する可能性があります(例if failing_command
:)failing_command || fallback
。サブシェルのコマンドは、親シェルではなくサブシェルのみを終了させset -e; (false); echo foo
ますfoo
。
あるいは、またはbash(通常shではなくkshおよびzshを含む)でトラップを使用して、コマンドがゼロ以外の状態を返すときに実行するコマンドを指定できます(ERR
例:)trap 'err=$?; echo >&2 "Exiting on error $err"; exit $err' ERR
。同様の状況では、(false); …
ERR トラップは子シェルで実行されるため、親シェルは終了しません。