ウェブサイト検索

BashにはTRY CATCHコマンドがありますか?


“Bash ” は “try/catch ” コマンドをサポートしていません。しかし、“if/else ” 文、“OR ” 演算子、“trap ” コマンド、または “-x ” フラグなど、その機能を適用する他の方法があります。

「try-catch」は例外を処理するために使用されるプログラミング用語です。簡単に言うと、「try」ブロックは何らかの作業を試み、もしファイルが見つからないといったエラーが発生した場合、例外がスローされ、それを「catch」ブロックにコピーすることができます。

このガイドでは、「try/catch」コマンドの代わりに使用できるアプローチについて探ります。

  • 「終了ステータス」を確認してください。
  • 「トラップ」コマンド。
  • 「-xフラグ」を使用してトレース出力を取得します。
  • 異常が検出されたとき、「強制終了」

エグジットステータスを確認する

すべてのコマンドは1桁の値(「真」の場合は「0」、および「偽」の場合は「1」)を生成します。これは「set -e」オプションを使用して行われます。このオプションは、スクリプト内のコマンドのいずれかが非ゼロコードで終了した場合、Bashに直ちに終了するよう指示します。以下の例では、スクリプトがシステムにFirefoxをインストールします。成功した場合、「コマンドが成功しました」というメッセージが表示されます。

#!/bin/bash

set -e

sudo apt install firefox

echo "Command succeeded"

実行する前に、chmodコマンドの+xオプションを使用して、それに実行権限を付与してください(上記のスクリプトの名前は「script.sh」です)。

sudo chmod +x script.sh

上記の実行されたコマンドは、ファイル「script.sh」に実行権限が付与されたことを確認しています。しかし、実行するには以下のコマンドを適用してください:

bash script.sh

上の画像を見ると、「コマンドが成功しました」というメッセージが表示されているため、コマンドが成功裏に実行されたことが明らかです。コマンドが実行された直後に「終了ステータス」を確認するためにechoコマンドを使用できるシナリオはいくつか考えられます。

「trap」コマンドをTRY CATCHとして機能させる方法は?

「trap」コマンドは、OSまたはユーザーから送信される信号に基づいて機能します(プログラムを中断するために「CTRL+C」を押すことで)。これは特定のコマンドに応答するトリガーです。たとえば、以下のスクリプトはユーザーが「CTRL+C」を押すまで実行されます。一度押されると、「trap worked」というメッセージを表示し、ユーザーに制御を戻す前に「5」秒間スリープします。

#!/bin/bash

trap 'echo "trap worked"' INT

(

trap '' INT

sleep 5

echo "done"

) &

wait

上記のスクリプトは「script.sh.」という名前です。結果を見るために実行しましょう:

bash script.sh

上記のターミナルでは、CTRL+C を押すと trap worked と表示されることが確認でき、これが使用されるシナリオは複数あります。例えば、以下のスクリプトでは、サービスが実行中の時にそのサービスを停止して再起動します。この場合、サービスを「mysql」と仮定しましょう:

#!/bin/bash

function finish {

echo "service started"

sudo service mysql start

}

trap finish EXIT

echo "service stopped"

sudo service mysql stop

スクリプトは「script.sh」と名付けられています。それを実行して出力を確認しましょう:

bash script.sh

上記のターミナルに見られるように、まずサービスを停止し、その後再起動します。サービスを停止した直後にすぐに再起動したい場合は、「CTRL+C」を押してください:

bash script.sh

上記の例は「try/catch」に似ており、複数のコマンドを含むスクリプトの実行に時間がかかります。「CTRL+Z」ショートカットキーを使用すると、この時間を短縮できますが、「echo」コマンドを介して表示されたメッセージは表示されません。しかし、「trap」コマンドを使用すると、どのコマンドが正常に機能しているか、どれが機能していないかを特定しやすくなります。

Bashで「-xフラグ」を使用して出力をトレースする方法は?

「-x」フラグは、bashスクリプトのデバッグに使用されます。実行される各行を解釈し、スクリプト内のすべてを表示します。これを使用するには、コマンドを実行する際に前に「-x」を追加します。以下のように:

bash -x script.sh

上の画像は、スクリプトのパラメータを実行される形式と同じ形式で表示しています。

エラーが検出されたときにBashで強制終了する方法は?

「set」はbashの「errexit」または「-e」と共に使用され、コマンドがエラーの際に自動的に終了します。このオプションは、「Bash」に対して、任意のコマンドがゼロ以外の終了ステータスを返した場合にスクリプトを直ちに終了するよう指示します。

以下は、システムリポジトリが更新され、Pythonがインストールされ、gitがクローンされ、Pythonの要件がインストールされ、最後にサーバーが起動される例のスクリプトです。

#!/bin/bash

sudo apt-get update

sudo apt install git curl python3-pip

git clone https://github.com/example/repo.git

pip3 install -r requirements.txt

python3 app.py

それは「script.sh」と名付けられています。それを実行するには、以下のコマンドを適用します。

bash script.sh

上記に提供された「ユーザー名」と「パスワード」はGitHubに対して不正確であり、これにより以下に示すスクリプトの終了を引き起こすエラーが発生します:

上記のように、エラーが発生するとスクリプトは即座に終了します。

結論

bashスクリプトは、他の多くのコーディング言語のように「try/catch」ステートメントをサポートしていません。しかし、同様の機能を適用するための他の代替手段があります。たとえば、「exit status」を確認したり、「trap」コマンドを適用したり、「-x」フラグで出力をトレースしたりすることができます。これらも有用です。また、エラーが発生した場合には「set -e」コマンドを使用してスクリプトを即座に終了させることができます。このガイドでは、bashにおける「try/catch」コマンドの状態とその代替手段について説明しました。