shell 如何在bash陷阱上运行函数

b1payxdu  于 2023-03-19  发布在  Shell
关注(0)|答案(2)|浏览(116)

我正在学习如何在bash中使用trap,我正在使用ubuntu ohmyzsh。
这是一个测试用例,但是我希望调用一个函数,该函数的参数是调用函数时传入的参数,而函数在退出时被调用,现在它甚至不调用trap中的函数。

xtest() {
    trap 'xecho' EXIT
    echo 'start'
    while :; do echo 'Hit CTRL+C'; sleep 1; done
}

xecho() {
    echo "done $1"
}

我只是

$ xtest foo
start
Hit CTRL+C
Hit CTRL+C
^C%

我注意到这个answer使用SIGINT,并且在trap调用的函数中使用exit,但是然后它关闭了终端,否则它不会停止循环,所以仍然很困惑,并且它对我的例子没有帮助,让参数foo在break上回显。

yrwegjxp

yrwegjxp1#

首先,zshbash是不同的shell,虽然有许多相似之处,但还有一些不同之处。
正如Is trap EXIT required to execute in case of SIGINT or SIGTERM received?中提到的,当接收到SIGINT时,EXIT陷阱不会在zsh中运行,这与bash不同。您需要使用SIGINT来代替。
还要注意,xecho必须显式调用exit

#!/usr/bin/zsh

xtest() {
    trap "xecho ${1}" INT
    echo 'start'
    while :; do echo 'Hit CTRL+C'; sleep 1; done
}

xecho() {
    echo "done $1"
    exit 0
}

xtest

zsh中,EXIT陷阱将在主脚本中定义的脚本正常退出时调用,和/或在函数中定义的函数退出时调用:

#!/usr/bin/zsh

trap "xecho ${0} ${1}" EXIT

xtest() {
    trap "xecho ${0} ${1}" EXIT
    echo "do something"
}

xecho() {
    echo "${1} ${2} done"
}

xtest foo
xtest bar

echo "main script ending"

输出:

do something
xtest foo done
do something
xtest bar done
main script ending
script.zsh  done
qoefvg9y

qoefvg9y2#

非常简单,就像正常调用函数一样调用它
我的脚本.sh:

#!/usr/bin/env bash

function foo {
  echo "hi, foo is called"
  exit 123
}
trap 'foo' EXIT

sleep 30

bash客户端:

$/home/my_script.sh # Process is sleeping
# Hitting CTRL+C
hi, foo is called

相关问题