Bash
在 bash 中使用陷阱 EXIT 後如何繼續執行?
環境: GNU bash,版本 3.2.57(1)-release (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
到目前為止嘗試的步驟:
- 嘗試使用
shopt -s extdebug
,但這似乎不適用於 EXIT。trap - EXIT
在裡面試過doNotExitProgram()
- 嘗試
trap - EXIT
返回return 0
內部doNotExitProgram()
- 嘗試
trap - EXIT
返回return 1
內部doNotExitProgram()
return 0
在裡面試過doNotExitProgram()
return 1
在裡面試過doNotExitProgram()
trap "" EXIT
在裡面試過doNotExitProgram()
**編輯:**如果可能的話不要改變
foo()
使用
x
選項 (bash -x file
):+ trap doNotExitProgram EXIT + foo + echo 'Inside foo()' Inside foo() + exit 170 + doNotExitProgram + echo 'Ignoring EXIT' Ignoring EXIT
trap doNotExitProgram EXIT``doNotExitProgram
呼叫時發生呼叫exit
。呼叫時foo
,執行doNotExitProgram
。exit
完成腳本執行所以不執行echo "Continue execution here"
。解決:
#!/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"
結果:
Inside foo() Ignoring EXIT Continue execution here
有
x
選項:+ trap doNotExitProgram EXIT + foo + echo 'Inside foo()' Inside foo() + exit 170 ++ doNotExitProgram ++ echo 'Ignoring EXIT' Ignoring EXIT + echo 'Continue execution here' Continue execution here
您可以在子shell 中設置陷阱。將輸出預期值。