web-dev-qa-db-ja.com

bashスクリプトでの「終了」の使用を可能な限り避けるのが望ましいですか?

私はPHPで、可能な限りexitコマンドの使用を避けることが好ましいと言われました。

Bashについても同様ですか?

たとえば、次のとおりです

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
else
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile
fi

これに優先?

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
        exit
fi
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile
4
user784637

コード完了 」を引用

読みやすさを向上させる場合は[exit]を使用する特定のルーチンでは、答えがわかったら、すぐに呼び出し元ルーチンに[exit]します。エラーを検出すると、クリーンアップを必要としないようにルーチンが定義されている場合、すぐに[終了する]ことは、より多くのコードを記述する必要があることを意味します。

そのため、通常は1つのexitが推奨されます(コードを見ている人は正しいexitステートメントを見つける必要はありません)が、エラーチェック(特に複数のexitステートメントを持つプログラム/ルーチンの開始時)は明確です。

あなたの例は境界線ですが、私はあなたのプログラム/スクリプトのメンテナンスがそれを整然とさせることができるように私は2番目が好まれると言いたいです。

あなたのプログラムは現在(psudocodeで)

if error condition 1
    // Show error message 1
else
    // Do stuff
fi

または

if error condition 1
    // Show error message 1
    // exit
fi

// Do stuff

プログラムが成長すると、プログラムが失敗する可能性のあるいくつかの方法がわかります。あなたのプログラムは今

if error condition 1
    // Show error message 1
else 
    if error condition 2
         // Show error message 2
    else
         if error condition 3
             // Show error message 3
         else
             // Do stuff
         fi
    fi
fi

または多分

if error condition 1
    // Show error message 1
else if error condition 2
    // Show error message 2
else if error condition 3
    // Show error message 3
else
    // Do stuff
fi

versus

if error condition 1
    // Show error message 1
    // exit
else if error condition 2
    // Show error message 2
    // exit
else if error condition 3
    // Show error message 3
    // exit
fi

// Do stuff

私の考えでは、最後の方がエラーケースとプログラムのメインフローを見つけることができるという点で最も明確です。ここで、異なる値を返すことを追加します(たとえば、成功の場合は0、エラー1の場合は1、エラー2の場合は2など)。その差はより顕著になります。

6
Portablejim

私はそれがあなたのコードとあなたが達成しようとしていること、トラップ、エラー処理などにある程度スクリプトに依存していると思います.

一般的に、終了ステータスを指定する必要があります

exit 1

またはset -e

#!/bin/bash -e

さまざまな方法でエラー管理を追加できます

command 1 || echo "command 1 failed"

トラップへの関数の作成。

参照を伴うニース(入門)ディスカッションがいくつかあります。

2
Panther

私の好みはこれです:

#!/bin/bash
if [[ -z "$1" ]]; then
        # Notice that I added quotes and redirection
        echo "You need to enter the directory you want to backup" 1>&2
        exit
fi
# Notice that I fixed the indentation
sourceFile="$1"
targetFile="/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)"
tar cvf "$targetFile" "$sourceFile"

プログラムが続行できないことが明らかな時点、またはプログラムが明確に終了した時点で終了すると、最もクリーンなコードになると思います。

無関係な注意として、Bashで引用符で囲まれていない文字列に注意してください。彼らは遅かれ早かれあなたを噛むでしょう。引用符で囲まれていない動作を特に必要としない限り、文字列を常に二重引用符で囲むことは(技術的に不要な場合でも)良い習慣です。また、bashを使用している限り、[[[よりもはるかに優れています。

1
Scott Severance