trap命令Linux
trap命令用于捕获指定的信号并执行预定义的命令,为shell内置命令
有两个常用选项
基本语法:
trap 'command' signal
signal是要捕获的信号,command是捕获到信号后,将要执行的命令,命令可以是若干条shell语句,也可以是一个函数
shell脚本在执行时,会产生三个"伪信号"(由shell产生,与os无关),trap也可捕获这三个"伪信号"
shell "伪信号"
- 信号名 产生时间
- EXIT 从一个函数中退出或整个脚本执行完毕
- ERR 当一条命令返回非0状态
- DEBUG 脚本中每条命令执行之前
- EXIT
通过捕获EXIT信号,可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪变量的值
trap 'COMMAND' EXIT
1 #!/bin/env sh 2 3 function exittrap(){ 4 echo "[LINE:$1] Error: Command or Function exited with status $?" 5 } 6 #trap 'errtrap $LINENO' EXIT 7 trap "errtrap $LINENO" EXIT 8 9 function vbn(){ 10 echo 'vbn' 11 } 12 13 vbn
需要对trap后的command加''进行保护,否则LINENO在第六行就会被替换,输出的行号LINENO==1,是因为进到函数vbn执行的时候打开了子shell,LINENO是按照子shell来计数,执行完echo命令后,立即调用了全局errtrap函数(此时,仍在子shell中)
下面为使用""的情况 - ERR
通过捕获ERR信号,我们可以追踪执行不成功的命令或函数
#!/bin/evn sh function errtrap() { echo "[LINE:$1] Error: Command or function exited with status $?" } function foo() { return 0; } function bar() { return 1; } trap 'errtrap $LINENO' ERR zxc foo bar
- DEBUG
通过捕获DEBUG信号,我们只需要一条trap语句就可以完成相关变量的全程跟踪
#!/bin/env sh trap 'echo "before execute line:$LINENO,a=$a,b=$b,c=$c" ' DEBUG a=1 if [[ $a -eq 1 ]] then b=2 else b=1 fi c=3 echo '############################'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律