returnコマンドとexitコマンドの違い
1. 概要
returnおよびexitコマンドは同様の目的で使用されます。 一般に、 return の目的は、 Bash関数を終了することですが、 exit の目的は、Bashスクリプトを終了することです。 ]。
このチュートリアルでは、いくつかの例を使用して、これら2つのコマンドの違いについて説明します。
2. returnコマンド
return は、Bash関数の実行を停止します。
return に整数引数を指定すると、その引数が終了ステータスとして関数呼び出し元に返されます。 それ以外の場合は、returnの前に実行された最後のコマンドの終了ステータスを関数呼び出し元に返します。
2.1. returnを使用してBash関数を終了する
次のBashスクリプトexamine_return.shを使用して、returnの動作を調べてみましょう。
#!/bin/bash
foo()
{
if [ ! –z “$1” ]
then
return $1
fi
ls /non_existing_file >& /dev/null
return
}
foo 5
echo “The return value of \”foo 5\” : $?”
foo
echo “The return value of \”foo\” : $?”
The foo() このスクリプトの関数は、を使用して引数を自分自身に渡すかどうかをチェックします
に引数を渡さない場合 foo() 関数、次に条件式
最後に、スクリプトで foo()関数を2回呼び出します。 最初の呼び出しでは、引数5を渡すことによって呼び出します。 2番目の呼び出しでは、引数を渡さずに呼び出します。 どちらの場合も、 echoコマンドと$?を使用して、関数の終了ステータスを出力します。
スクリプトexamine_return.shを実行して、結果を確認してみましょう。
$ examine_return.sh
The return value of ”foo 5” : 5
The return value of ”foo” : 2
ご覧のとおり、結果は期待どおりです。 関数の引数として5を渡すため、最初の関数呼び出しの終了ステータスは5です。 一方、2番目の関数呼び出しの終了ステータスは次のとおりです。 2、 これはの終了ステータスであるため ls / non_existing_file>&/ dev / null コマンド、関数を終了する前に実行された最後のコマンド。
2.2. returnを使用してBashスクリプトを終了する
return を使用してスクリプトを終了するとどうなりますか? Examine_return_from_script.sh、以前に見たもののわずかに変更されたバージョンを使用して試してみましょう。
#!/bin/bash
foo()
{
if [ ! –z “$1” ]
then
return $1
fi
ls /non_existing_file >& /dev/null
return
}
foo 5
echo “The return value of \”foo 5\” : $?”
foo
echo “The return value of \”foo\” : $?”
return 0
この変更されたバージョンのスクリプトは、スクリプトの最後にある最後の return ステートメントという1つの追加を除いて、前のバージョンと同じです。 このスクリプトを実行してみましょう:
$ examine_return_from_script.sh
The return value of "foo 5" : 5
The return value of "foo" : 2
examine_return_from_script.sh: line 20: return: can only ‘return’ from a function or sourced script
エラーが発生したため、returnを使用してスクリプトを終了することはできません。
ただし、スクリプトの出力が示すように、ソースコマンドを使用してスクリプトを実行できます:
$ source examine_return_from_script.sh
The return value of ”foo 5” : 5
The return value of ”foo” : 2
$ echo $?
0
出力から明らかなように、スクリプトの終了ステータスは 0、であり、これは return0の結果です。
3. exitコマンド
return と同様に、整数の引数を取ることができます。 その場合、スクリプトは終了ステータスを整数引数に設定して終了します。 exit に引数を渡さないと、 exit。の前に実行された最後のコマンドの終了ステータスに設定された終了ステータスで終了します。
3.1. Bash関数内でexitを使用する
次のスクリプトexamine_exit.shを使用して、Bash関数でのexitの動作を調べてみましょう。
#!/bin/bash
foo()
{
if [ ! –z “$1” ]
then
exit $1
fi
ls /non_existing_file >& /dev/null
exit
}
if [ ! –z “$1” ]
then
foo $1
else
foo
fi
echo “This line will not be printed”
このスクリプトのfoo()関数は、Examine_return.shの関数と非常によく似ています。 returnコマンドをexitコマンドに置き換えました。 また、スクリプトの最後に echo コマンドを追加して、exitの直後にスクリプトが終了することを証明しました。
後で、スクリプトで foo()関数を呼び出します。 引数を渡してスクリプトを実行する場合は、同じ引数を関数に渡して foo()関数を呼び出します。 引数なしでスクリプトを実行する場合は、引数なしで foo()関数を呼び出します。
それでは、スクリプトを実行してみましょう。
$ examine_exit.sh 6
$ echo $?
6
$ examine_exit.sh
$ echo $?
2
スクリプトの最初の実行では、6の終了ステータスで終了しました。 2回目の実行では、引数なしで、スクリプトは 2の終了ステータスで終了しました。は、exit。の前のlsコマンドの終了ステータスです。
foo()関数呼び出し内でスクリプトをすぐに終了したため、両方の実行でechoコマンドからの出力はありませんでした。
3.2. Bash関数の外部でexitを使用する
また、Bash関数の外部でexitを使用してスクリプトを終了できることも示しましょう。 次のスクリプトexamine_exit_anywhere.shがあります。
#!/bin/bash
echo “This line will be printed”
exit 0
echo “But this line will not be printed”
foo()
{
if [ ! –z “$1” ]
then
exit $1
fi
ls /non_existing_file >& /dev/null
exit
}
if [ ! –z “$1” ]
then
foo $1
else
foo
fi
echo “This line will not be printed”
このスクリプトは、以前に使用したスクリプトExamine_exit.shと非常によく似ています。 2つのechoコマンドをスクリプトの先頭に追加し、その間に exit0コマンドを追加しました。
スクリプトを実行してみましょう:
$ examine_exit_anywhere.sh
This line will be printed
$ echo $?
0
ご覧のとおり、最初のエコーが実行されました。 echoの後のexit0 により、スクリプトは終了ステータス0で終了しました。 スクリプトの残りのコマンドは実行されませんでした。
4. trapコマンドをexitで使用する
exitとreturnのもう1つの違いは、trapコマンドに関連しています。 通常、トラップを使用して信号を処理しますが、トラップする信号としてEXITを指定すると、スクリプトがexitで終了したときにトラップに割り当てられたアクションが実行されます。
次のスクリプトexamine_trap.shでこれを明確にしましょう。
#!/bin/bash
trap “echo This line will be printed at exit” EXIT
foo()
{
echo “I am inside the foo function”
return 0
}
foo
echo “I am outside the foo function”
exit 0
スクリプトの先頭にあるtrapは、echoコマンドを呼び出すだけです。 foo()関数は、メッセージを出力し、returnを使用して戻ります。 最後に、別のメッセージを出力した後、 exit。を使用してスクリプトを終了します。
スクリプトを実行してみましょう:
$ examine_trap.sh
I am inside the foo function
I am outside the foo function
This line will be printed at exit
ご覧のとおり、exitの前にreturnを呼び出しましたが、trapのメッセージはexitの後に出力されました。 したがって、シェルはEXITでトラップを実行して終了しますが、returnでは実行しません。
5. 結論
この記事では、returnコマンドとexitコマンドの違いについて説明しました。
関数内または関数外のいずれかで、スクリプト内の任意の場所でexitを呼び出すことができます。これにより、スクリプトの実行がすぐに停止します。
関数でreturnを呼び出すことができます。これにより、関数の実行がすぐに停止します。 スクリプトを終了するためにreturnを使用すると、エラーが発生します。 ただし、スクリプトを入手してもエラーは発生しません。
シェルは、exitのEXITでtrapコマンドのアクションを実行しますが、returnのアクションは実行しません。