GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプトでのエラー処理

スクリプトは、バックアップの実行、ユーザー/グループの追加、パッケージのインストール/更新など、システム管理者が日常の一連のアクティビティを管理するための重要なツールの1つです。スクリプトを作成する際、エラー処理は重要なツールの1つです。管理するもの。

この記事では、Bashスクリプトでエラー処理を処理するための基本/中級のテクニックをいくつか紹介します。エラーコードを取得する方法、スクリプトの実行中に詳細な出力を取得する方法、デバッグ機能を処理する方法、および標準のエラーリダイレクトについて説明します。これらの手法を使用すると、システム管理者は日常業務を簡単にすることができます。

[読者も気に入った:Bashコマンドラインの終了コードの謎を解き明かす]

終了ステータス

Bashスクリプトでは、$? 終了ステータスを出力します。ゼロを返す場合は、エラーがないことを意味します。ゼロ以外の場合は、前のタスクに問題があると結論付けることができます。

基本的な例は次のとおりです。

$ cat myscript.sh
           #!/bin/bash
           mkdir learning
           echo $?

上記のスクリプトを1回実行すると、0が出力されます。 ディレクトリが存在しないため、スクリプトによって作成されます。当然、以下に示すように、スクリプトを2回実行すると、ゼロ以外の値が取得されます。

$ sh myscript.sh
mkdir: cannot create directory 'learning': File exists
1

ベストプラクティス

-eを追加して、デバッグモードを有効にすることを常にお勧めします 以下のようなシェルスクリプトのオプション:

$ cat test3.sh
!/bin/bash
set -x
echo "hello World"
mkdiir testing
 ./test3.sh
+ echo 'hello World'
hello World
+ mkdiir testing
./test3.sh: line 4: mkdiir: command not found

以下の例を使用して、いつでも呼び出すのに役立つデバッグ関数を次のように記述できます。

$ cat debug.sh
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
 [ "$_DEBUG" == "on" ] && $@
}
DEBUG echo 'Testing Debudding'
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"

印刷するもの:

$ ./debug.sh
Testing Debudding
+ a=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5

標準エラーリダイレクト

2 の番号で示される標準エラーを使用して、すべてのシステムエラーをカスタムファイルにリダイレクトできます。 。以下に示すように、通常のBashコマンドで実行します。

$ mkdir users 2> errors.txt
$ cat errors.txt
mkdir: cannot create directory ‘users’: File exists

ほとんどの場合、スクリプトで正確な行番号を見つけることは困難です。エラーのある行番号を印刷するには、 PS4を使用します オプション(Bash 4.1以降でサポートされています)。以下の例:

$ cat test3.sh
#!/bin/bash
PS4='LINENO:'

set -x
echo "hello World"
mkdiir testing

エラーを読みながら行番号を簡単に確認できます:

$ /test3.sh
5: echo 'hello World'
hello World
6: mkdiir testing
./test3.sh: line 6: mkdiir: command not found

[この無料の電子書籍を入手する:ダミーのKubernetesクラスターを管理する。 ]

まとめ

エラーの管理は、スクリプトを作成する際の管理者にとって重要なスキルです。これらのヒントは、Bashスクリプトや一般的なコマンドのトラブルシューティングを行う際の作業を楽にするのに役立ちます。


Linux
  1. ディレクトリに入るときにBashスクリプトを実行しますか?

  2. タイプセット-aスクリプトにエラーがありますか?

  3. Bashスクリプトエラー:整数式が必要ですか?

  1. Bash:予期しないトークン `}’の近くの構文エラー?

  2. 複数のシェルスクリプト間で変数を共有しますか?

  3. Bash スクリプトでエラーを発生させる

  1. 自動化のためのBashの使用

  2. 例でBashエラー処理を学ぶ

  3. Bashスクリプトに.shまたは.bash拡張子を使用しますか?