環境:GNU bash、バージョン 3.2.57(1)-リリース(x86_64-apple-darwin20)
他の関数の終了をキャッチしようとしていますが、プログラムの実行を続けます。オブジェクト指向言語では、例外をキャッチして再度発生させることなく実行を続行できます。これが私が望むものです。関数を期待していますが、foo()
このexit
場合は関数をキャプチャしてプログラムの実行を続けたいと思います。
#!/bin/bash
function doNotExitProgram()
{
echo "Ignoring EXIT"
# Magic happens here
}
trap doNotExitProgram EXIT
function foo()
{
echo "Inside foo()"
exit 170
}
foo
echo "Continue execution here"
期待される:
foo() 内部は
EXIT を無視し
、ここで実行を続けます。
実際:
foo() 内部では
EXIT を無視します。
これまでに試した手順:
EXITを試してみましたが、うまく
shopt -s extdebug
いかないようです。trap - EXIT
内部で試すdoNotExitProgram()
中に
trap - EXIT
戻ろうとするreturn 0
doNotExitProgram()
中に
trap - EXIT
戻ろうとするreturn 1
doNotExitProgram()
return 0
内部で試すdoNotExitProgram()
return 1
内部で試すdoNotExitProgram()
trap "" EXIT
内部で試すdoNotExitProgram()
このシーンはありませんtldp.orgの罠またはトラップのマニュアルページ。
編集する:可能であれば変更しないでください。foo()
ベストアンサー1
または、ヘルパー機能を使用してください。
#!/bin/bash
function doNotExitProgram()
{
echo "Ignoring EXIT"
# Magic happens here
}
function catchExitCode()
{
case $1 in
170 )
doNotExitProgram
;;
esac
}
trap 'catchExitCode $?' DEBUG
function foo()
{
echo "Inside foo()"
return 170
}
foo
echo "Continue execution here"
という分岐関数を追加できますcatchExitCode
。欠点は、他の実行可能ファイルが返されるとハイジャックされる可能性があることです170
。独自の終了コードを使用すると、ロジックを分岐できます。