一. trap捕捉到信号之后,可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap " " signal-list
注意:
(1) 对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2) 在trap中可以定义对信号0的处理(实际上没有这个信号), shell程序在其终止(如
执行exit语句)时发出该信号。
(3) 在捕捉到signal-list中指定的信号并执行完相应的命令之后, 如果这些命令没有
将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将
很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会
对commands中的变量和命令进行替换, 否则commands中的变量和命令将用当时具体的值来
替换。
linux shell编程 trap命令
trap命令用于指定在接收到信号后将要采取 的行 动,我们将在本书后面的内容中详细介绍信号。trap命令的一种常见用途是在脚本程序被中断时完成清理工作。历史上,shell总是用数字来代表信号,而 新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。你可以在命 令提示符下输入命令trap -l来查看信号编号及其关联的名称。
对于那些不熟悉信号的人们来说,“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
如果要重置某个信号的处理条件到其默认值,只需简单的将command设置为-。如果要忽略某个信号,就把command设置为空字符串‘’。一个不带参数的trap命令将列出当前设置的信号及其行动的清单。
表2-11列出了X/Open规范里面规定的能够被捕获的比较重要的一些信号(括号里面的数字是传统的信号编号)。更多细节请参考signal在线手册的第七部分(man 7 signal)。
表 2-11
信 号
|
说 明
|
HUP(1)
|
挂起,通常因终端掉线或用户退出而引发
|
INT(2)
|
中断,通常因按下Ctrl+C组合键而引发
|
QUIT(3)
|
退出,通常因按下Ctrl+\组合键而引发
|
ABRT(6)
|
中止,通常因某些严重的执行错误而引发
|
ALRM(14)
|
报警,通常用来处理超时
|
TERM(15)
|
终止,通常在系统关机时发送
|
实验:信号处理
下面的脚本演示了一些简单的信号处理方法:
运行这个脚本,在每次循环时按下Ctrl+C组合键(或任何你系统上设定的中断键),我们将得到如下所示的输出:
实验解析
在这个脚本程序中,我们先用trap命令安排它在出 现一个INT(中断)信号时执行rm –f /tmp/my_tmp_file_$$命令删除临时文件。脚本程序然后进入一个while循环,只要临时文件存在,循环就一直持续下去。当用户按下 Ctrl+C组合键时,就会执行rm –f /tmp/my_tmp_file_$$语句,然后继续下一个循环。因为临时文件现在已经被删除了,所以第一个while循环将正常退出。
接下来,脚本程序再次调用trap命令,这次是指定 当一个INT信号出现时不执行任何命令。脚本程序然后重新创建临时文件并进入第二个while循环。这次当用户按下Ctrl+C组合键时,没有语句被指定 执行,所以采取默认处理方式,即立即终止脚本程序。因为脚本程序被立即终止了,所以永远也不会执行最后的echo和exit语句。
16.unset命令
unset命令的作用是从环境中删除变量或函数。这个命令不能删除shell本身定义的只读变量(如IFS)。这个命令并不常用。
下面的脚本第一次输出字符串“Hello World”,但第二次只输出一个换行符:
使用foo=语句产生的效果与上面脚本中的unset命令产生的效果差不多,但并不等同。foo=语句将变量foo设置为空,但变量foo仍然存在。而使用unset foo语句的效果是把变量foo从环境中删除
相关推荐
"Linux系统下trap命令在Shell编程中的应用" Trap命令是Linux系统中Shell编程的一种重要命令,用于捕获信号并执行预定义的命令。该命令可以帮助程序员捕获各种信号,如错误的系统调用、用户产生的中断、非法指令等,...
Linux Shell编程是Linux系统管理与自动化任务处理的重要组成部分。Shell是一种命令行解释器,它提供了与操作系统交互的接口,允许用户执行系统命令、编写脚本并进行文件操作。本教程将深入探讨Linux Shell编程的经典...
9. **脚本调试**:学会使用`set -x`开启命令追踪,`set -u`检测未定义变量,以及`trap`命令捕获信号,可以帮助我们调试和优化脚本。 10. **Shell扩展**:Bash提供了许多高级特性,如数组、关联数组、命令替换、过程...
**Linux Shell 商品信息管理系统详解** Linux Shell是一种强大的命令行接口,用于与操作系统进行交互,它允许用户通过文本命令执行各种任务。在这个“Linux Shell版商品信息管理系统”中,我们将会探讨如何利用...
12. **Shell的调试**:介绍了如何使用trap命令、tee命令和“调试钩子”,以及Shell的执行选项来进行脚本调试。 13. **Shell综合案例一**:手把手教你如何手动及通过脚本安装Linux Nginx Mysql PHP和WordPress,实现...
《LINUX SHELL脚本攻略 中文版》是一本针对Linux系统中SHELL脚本编程的实战指南,旨在帮助读者掌握高效、实用的SHELL脚本编写技巧。书中的内容覆盖了从基础知识到高级应用,通过解决110多个实际问题,展示了作者的...
- **信号处理**:使用`trap`命令捕获信号,并指定相应的处理函数。 - **定时任务**:利用`cron`计划任务来定期执行脚本。 #### 六、实践案例 1. **备份文件或目录**: - 使用`tar`命令创建压缩存档。 - 示例...
12. **函数和脚本调试**:学会使用set命令和trap命令进行脚本调试和错误处理。 通过这个"Linux Shell Tutorial"教程,你可以逐步深入到这些主题中,从而提升你在Linux环境中的操作效率和自动化能力。不论是日常的...
10. **错误处理和调试**:学会使用`set`命令设置Shell选项,以及`echo`、`echoerr`和`trap`进行错误处理和脚本调试。 在`Linux shell 命令大全.chm`这个压缩文件中,用户可以找到上述各类命令的详细说明、参数选项...
8. **脚本调试**:学习如何设置陷阱(trap)处理信号,以及使用`set`命令和`echo`调试脚本。 9. **文件包含**:通过`.`(source)命令来执行其他脚本或配置文件,实现代码复用。 10. **Shell脚本实践**:通过书中...
.html`和`3.19Linux Shell trap命令:捕获信号.html`、`3.20Linux Shell trap命令捕获信号实例演示.html`将介绍Linux中的信号机制,这是一种进程间通信方式,用于通知进程某些事件的发生。trap命令允许我们定义当...
6. **错误处理**:学习如何捕获和处理脚本运行时可能出现的错误,使用set命令和trap命令来提高脚本的健壮性。 7. **脚本调试与优化**:了解如何使用debugger工具如bashdb,以及如何通过优化脚本来提高性能。 8. **...
10. **Shell扩展与高级特性**:如数组、关联数组、过程子Shell、陷阱(trap)和异步执行(&)等。 通过阅读这本书,读者不仅可以掌握编写Shell脚本的基础技能,还能深入了解Linux系统的运行机制,从而更好地利用...
### Linux Shell调试技术详解 #### 一、Shell脚本错误...综上所述,通过合理使用`trap`、`tee`等工具和技术,我们可以在Shell脚本开发过程中有效地进行调试,提高代码的质量和可维护性。希望这些内容对你有所帮助!
《Linux Shell从初学到精通第2版》是一本旨在帮助读者深入理解并熟练掌握Linux Shell编程的书籍。源代码作为书中的重要组成部分,为学习者提供了实践和探索的平台。在学习Linux Shell的过程中,理解并操作这些源代码...
本文将围绕"Linux shell实例精解"这一主题,深入探讨Linux shell编程的核心概念、语法和常见实例,帮助你更好地理解和掌握这一技能。 一、shell概述 Linux shell是一个命令解释器,它接收用户的输入并执行相应的...
如何通过set命令来启用或禁用各种Shell选项,以及如何使用trap命令处理信号,都是开发者需要掌握的重要技能。 在实际应用中,Shell脚本经常用于系统管理和自动化任务,例如备份、日志分析、监控等。攻略中可能会...
学会使用trap命令捕获和处理信号也是提升脚本健壮性的关键。 此外,本书可能还会涉及脚本优化和性能提升,如使用alias简化命令,使用source命令直接执行脚本,以及编写函数库提高代码复用性。最后,了解如何编写可...
要达到这个境界,管理者必须具备相当程度的Shell操控能力与Shell程序设计能力,卧龙小三拥有丰富的主机管理实务经验,以及多年的教学经验,相信这本《实战Linux Shell编程与服务器管理》必能引领读者轻松跨越Bash ...
本项目是一个使用Linux Shell脚本实现的简单作业管理系统,它提供了对学生和教师友好的交互界面,使得作业管理更加高效。以下是这个系统中涉及的关键知识点: 1. **Shell脚本基础**:Linux Shell脚本是一种解释型...