Bash

在 bash 中使用陷阱 EXIT 後如何繼續執行?

  • February 16, 2022

環境: 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

到目前為止嘗試的步驟:

  1. 嘗試使用shopt -s extdebug,但這似乎不適用於 EXIT。
  2. trap - EXIT在裡面試過doNotExitProgram()
  3. 嘗試trap - EXIT返回return 0內部doNotExitProgram()
  4. 嘗試trap - EXIT返回return 1內部doNotExitProgram()
  5. return 0在裡面試過doNotExitProgram()
  6. return 1在裡面試過doNotExitProgram()
  7. trap "" EXIT在裡面試過doNotExitProgram()

tldp.org上的陷阱或陷阱手冊頁上沒有描述這種情況。

**編輯:**如果可能的話不要改變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,執行doNotExitProgramexit完成腳本執行所以不執行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 中設置陷阱。將輸出預期值。

引用自:https://unix.stackexchange.com/questions/690850