sh脚本和bash脚本_在脚本中使用Bash陷阱
sh脚本和bash脚本
很容易检测到shell脚本何时启动,但是并不总是容易知道何时停止。 脚本可能会正常终止,就像作者希望的那样终止,但是由于意外的致命错误,脚本也可能会失败。 有时,保留脚本失败时正在进行的所有操作的残余是有益的,而其他时候则很不方便。 无论哪种方式,检测脚本的结尾并以某种预先计算的方式对其做出React都是Bash trap
指令存在的原因。
应对失败
这是脚本中的一个失败可能导致未来失败的示例。 假设您编写了一个程序,该程序在/tmp
中创建了一个临时目录,以便它可以先取消归档和处理文件,然后再将它们以另一种格式捆绑在一起:
#!/usr/bin/env bash
CWD = ` pwd `
TMP = ${TMP:-/tmp/tmpdir}
## create tmp dir
mkdir " ${TMP} "
## extract files to tmp
tar xf " ${1} " --directory " ${TMP} "
## move to tmpdir and run commands
pushd " ${TMP} "
for IMG in * .jpg; do
mogrify -verbose -flip -flop " ${IMG} "
done
tar --create --file " ${1%.*} " .tar * .jpg
## move back to origin
popd
## bundle with bzip2
bzip2 --compress " ${TMP} " / " ${1%.*} " .tar \
--stdout > " ${1%.*} " .tbz
## clean up
/ usr / bin / rm -r / tmp / tmpdir
大多数情况下,脚本会按预期运行。 但是,如果您不小心在填充了PNG文件而不是预期的JPEG文件的存档上运行它,则该过程会中途失败。 一个失败导致另一个失败,最终,脚本退出而未达到删除临时目录的最终指令。 只要您手动删除目录,就可以快速恢复,但是如果您不打算这样做,那么下次运行脚本时,它必须处理一个充满了无法预测的剩余文件的现有临时目录。
解决此问题的一种方法是,通过在脚本开头添加预防性删除来反转和加倍逻辑。 虽然有效,但它依赖于蛮力而非结构。
trap
是更优雅的解决方案。
用陷阱捕捉信号
trap
关键字捕获执行期间可能发生的信号 。 如果您曾经使用过kill
或killall
命令(默认情况下调用SIGTERM
,则您已使用这些信号之一。 Shell还会响应许多其他信号,您可以使用trap -l
来查看其中的大多数信号(如“列表”中所示):
$ trap --list
1 ) SIGHUP 2 ) SIGINT 3 ) SIGQUIT 4 ) SIGILL 5 ) SIGTRAP
6 ) SIGABRT 7 ) SIGBUS 8 ) SIGFPE 9 ) SIGKILL 10 ) SIGUSR1
11 ) SIGSEGV 12 ) SIGUSR2 13 ) SIGPIPE 14 ) SIGALRM 15 ) SIGTERM
16 ) SIGSTKFLT 17 ) SIGCHLD 18 ) SIGCONT 19 ) SIGSTOP 20 ) SIGTSTP
21 ) SIGTTIN 22 ) SIGTTOU 23 ) SIGURG 24 ) SIGXCPU 25 ) SIGXFSZ
26 ) SIGVTALRM 27 ) SIGPROF 28 ) SIGWINCH 29 ) SIGIO 30 ) SIGPWR
31 ) SIGSYS 34 ) SIGRTMIN 35 ) SIGRTMIN+ 1 36 ) SIGRTMIN+ 2 37 ) SIGRTMIN+ 3
38 ) SIGRTMIN+ 4 39 ) SIGRTMIN+ 5 40 ) SIGRTMIN+ 6 41 ) SIGRTMIN+ 7 42 ) SIGRTMIN+ 8
43 ) SIGRTMIN+ 9 44 ) SIGRTMIN+ 10 45 ) SIGRTMIN+ 11 46 ) SIGRTMIN+ 12 47 ) SIGRTMIN+ 13
48 ) SIGRTMIN+ 14 49 ) SIGRTMIN+ 15 50 ) SIGRTMAX- 14 51 ) SIGRTMAX- 13 52 ) SIGRTMAX- 12
53 ) SIGRTMAX- 11 54 ) SIGRTMAX- 10 55 ) SIGRTMAX- 9 56 ) SIGRTMAX- 8 57 ) SIGRTMAX- 7
58 ) SIGRTMAX- 6 59 ) SIGRTMAX- 5 60 ) SIGRTMAX- 4 61 ) SIGRTMAX- 3 62 ) SIGRTMAX- 2
63 ) SIGRTMAX- 1 64 ) SIGRTMAX
使用
trap可以预期这些信号中的任何一个。 除这些之外, trap
识别:
EXIT
:在shell进程本身退出时发生ERR
:当命令(例如tar或mkdir )或内置命令(例如push或cd )以非零状态完成时发生DEBUG
:表示调试模式的布尔值
要在Bash中设置陷阱,请使用trap
后跟要执行的命令列表,然后是触发它的信号列表。
例如,此陷阱检测到SIGINT
,即当用户在进程运行时按下Ctrl + C时发送的信号:
trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT
带有临时目录问题的示例脚本可以通过检测SIGINT
,错误和成功退出的陷阱来修复:
#!/usr/bin/env bash
CWD = ` pwd `
TMP = ${TMP:-/tmp/tmpdir}
trap \
"{ /usr/bin/rm -r " ${TMP} " ; exit 255; }" \
SIGINT SIGTERM ERR EXIT
## create tmp dir
mkdir " ${TMP} "
tar xf " ${1} " --directory " ${TMP} "
## move to tmp and run commands
pushd " ${TMP} "
for IMG in * .jpg; do
mogrify -verbose -flip -flop " ${IMG} "
done
tar --create --file " ${1%.*} " .tar * .jpg
## move back to origin
popd
## zip tar
bzip2 --compress $TMP / " ${1%.*} " .tar \
--stdout > " ${1%.*} " .tbz
使用Bash函数
trap
语句。
巴什的陷阱
陷阱对于确保脚本顺利结束(无论脚本是否成功运行)很有用。 完全依靠自动化垃圾收集永远是不安全的,因此一般来说,这是一个好习惯。 尝试在脚本中使用它们,看看它们能做什么!
翻译自: https://opensource.com/article/20/6/bash-trap
sh脚本和bash脚本
sh脚本和bash脚本_在脚本中使用Bash陷阱相关推荐
- lua游戏脚本实例源码_在nginx中使用强大的lua实现定向需求
前言 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.其设计目的是为了嵌入应用程序中,从而为应用程序提供 ...
- jstack 脚本 自动日志_在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹...
该脚本可防止来自 监控工具 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件. -- Magesh Maruthamuthu(作者) 磁盘使用率 监控工具能够在达到给定阈值时提醒我们.但它们无法自 ...
- arcgis运行python脚本时闪退_关于ArcMap中打开ArcToolbox导致闪退的解决办法
最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务,发现按照套路打开ArcMap点击ArcToolbox时,发生了ArcMap的闪退现象,几经周折终于解决了问题. 希望也遇到这类问题的 ...
- 以下选项中使python脚本程序转变为_以下选项中使python脚本程序转变为可执行程序的第三方库的是:...
[多选题]拉式市场的供应链系统就是以客户为导向进行( ). [单选题]五行关系中"见肝之病,知肝传脾"是指 [单选题]已知立体的主视图和俯视图,正确的左视图是( ) ...
- python脚本自动运行失败_解决Python中定时任务线程无法自动退出的问题
python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子 ...
- 如何在Linux和Mac中清除Bash历史记录
Sometimes we run bash commands with sensitive information. For example, running a shell script and p ...
- sh脚本和bash脚本_我是如何开始使用bash脚本的
sh脚本和bash脚本 前几天我写了一个剧本. 对于某些人来说,这句话听起来没什么大不了的. 对于其他人,我知道您在外面,那句话很重要. 你看,我不是程序员. 我是作家 我需要解决的问题 我的问题很简 ...
- shell脚本删除冒号空格_从Bash漏洞学Shell脚本(冒号)
前天,爆发了Bash安全漏洞,非常恐怖.在网络上开始飞速传播,附带了非常友好的检测工具. $ env x='() { :;}; echo vulnerable' bash -c "echo ...
- apscheduler 脚本执行失败_在脚本中使用 Bash 信号捕获 | Linux 中国
无论你的脚本是否成功运行,信号捕获(trap)都能让它平稳结束. 来源:https://linux.cn/article-12715-1.html 作者:Seth Kenlon 译者:Hank Cho ...
最新文章
- Windows快捷操作
- perconadb mysql_是时候用PerconaDB替换MySQL了
- python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar
- FEC之异或运算应用
- JUC锁-框架与基本概念(一)
- 201609计算机控制技术作业三,计算机控制技术大作业2015..doc
- jsp分页代码mysql_jsp分页(jsp分页完整代码)
- 力天创见人脸识别分析客流量
- 画出传输门、三态门、开路门_传输门和三态门什么区别
- android 通知写法_Android消息通知-Notifation
- SAP 因谁而腾飞?NetApp
- 使用CSS3制作水晶按钮
- JZOJ100047. 【NOIP2017提高A组模拟7.14】基因变异
- 淘集集官宣破产,创业不易,且行且珍惜
- 网络摄像头IPC国标GB28181协议国标安防视频流媒体平台EasyGBS视频流不上线排查步骤
- 2021版王道数据结构课后代码题全部实现
- c 语言 蒙特卡洛程序,蒙特卡洛步骤学习(一)
- initramfs学习
- MySQL创建用户,更改密码
- “AI+”将比“互联网+”落地更容易