36

オプションが設定されたbashスクリプトがあり-e、最初のエラーでスクリプト全体が失敗します。

スクリプトでは、ディレクトリに対してを実行しようとしていますls。しかし、そのパスは存在する場合と存在しない場合があります。パスが存在しない場合、フラグが設定されlsているため、コマンドは失敗します。-e

スクリプトが失敗するのを防ぐ方法はありますか?

ちなみに、私はそのコマンドの前後に実行するトリックを試しましたがset +e、それは機能します。set -eしかし、私はいくつかのより良い解決策を探しています。

4

3 に答える 3

51

||ステータス0で終了することが保証されているコマンドを使用して、エラーを「キャッチ」できます。

ls $PATH || echo "$PATH does not exist"

$PATH複合コマンドは存在するかどうかに関係なく成功するため、set -eトリガーされず、スクリプトは終了しません。

trueエラーをサイレントに抑制するには、次のコマンドを使用できます。

ls $PATH || true

複数のコマンドを実行するには、次の複合コマンドの1つを使用できます。

ls $PATH || { command1; command2; }

また

ls $PATH || ( command1; command2 )

どちらの複合コマンドでも、失敗するものがないことを確認してください。2番目の例の利点の1つは、現在のシェルでのステータスに影響を与えることなく、サブシェル内で即時終了モードをオフにできることです。

ls $PATH || ( set +e; do-something-that-might-fail )
于 2012-09-20T01:38:25.923 に答える
5

別のオプションは、信号trapをキャッチするために使用することです。EXIT

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
于 2012-09-20T02:10:18.910 に答える
3

1つの解決策は、フォルダーの存在をテストすることです。

function myLs() {
    LIST=""
    folder=$1
    [ "x$folder" = "x" ] && folder="."
    [ -d $folder ] && LIST=`ls $folder`
    echo $LIST
}

このように、bashが存在しない場合でも失敗$folderしません

于 2012-09-20T01:32:19.237 に答える