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关键字捕获执行期间可能发生的信号 。 如果您曾经使用过killkillall命令(默认情况下调用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 :当命令(例如tarmkdir )或内置命令(例如pushcd )以非零状态完成时发生
  • 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陷阱相关推荐

  1. lua游戏脚本实例源码_在nginx中使用强大的lua实现定向需求

    前言 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.其设计目的是为了嵌入应用程序中,从而为应用程序提供 ...

  2. jstack 脚本 自动日志_在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹...

    该脚本可防止来自 监控工具 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件. -- Magesh Maruthamuthu(作者) 磁盘使用率 监控工具能够在达到给定阈值时提醒我们.但它们无法自 ...

  3. arcgis运行python脚本时闪退_关于ArcMap中打开ArcToolbox导致闪退的解决办法

    最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务,发现按照套路打开ArcMap点击ArcToolbox时,发生了ArcMap的闪退现象,几经周折终于解决了问题. 希望也遇到这类问题的 ...

  4. 以下选项中使python脚本程序转变为_以下选项中使python脚本程序转变为可执行程序的第三方库的是:...

    [多选题]拉式市场的供应链系统就是以客户为导向进行( ). [单选题]五行关系中"见肝之病,知肝传脾"是指 [单选题]已知立体的主视图和俯视图,正确的左视图是(         ) ...

  5. python脚本自动运行失败_解决Python中定时任务线程无法自动退出的问题

    python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子 ...

  6. 如何在Linux和Mac中清除Bash历史记录

    Sometimes we run bash commands with sensitive information. For example, running a shell script and p ...

  7. sh脚本和bash脚本_我是如何开始使用bash脚本的

    sh脚本和bash脚本 前几天我写了一个剧本. 对于某些人来说,这句话听起来没什么大不了的. 对于其他人,我知道您在外面,那句话很重要. 你看,我不是程序员. 我是作家 我需要解决的问题 我的问题很简 ...

  8. shell脚本删除冒号空格_从Bash漏洞学Shell脚本(冒号)

    前天,爆发了Bash安全漏洞,非常恐怖.在网络上开始飞速传播,附带了非常友好的检测工具. $ env x='() { :;}; echo vulnerable' bash -c "echo ...

  9. apscheduler 脚本执行失败_在脚本中使用 Bash 信号捕获 | Linux 中国

    无论你的脚本是否成功运行,信号捕获(trap)都能让它平稳结束. 来源:https://linux.cn/article-12715-1.html 作者:Seth Kenlon 译者:Hank Cho ...

最新文章

  1. Windows快捷操作
  2. perconadb mysql_是时候用PerconaDB替换MySQL了
  3. python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar
  4. FEC之异或运算应用
  5. JUC锁-框架与基本概念(一)
  6. 201609计算机控制技术作业三,计算机控制技术大作业2015..doc
  7. jsp分页代码mysql_jsp分页(jsp分页完整代码)
  8. 力天创见人脸识别分析客流量
  9. 画出传输门、三态门、开路门_传输门和三态门什么区别
  10. android 通知写法_Android消息通知-Notifation
  11. SAP 因谁而腾飞?NetApp
  12. 使用CSS3制作水晶按钮
  13. JZOJ100047. 【NOIP2017提高A组模拟7.14】基因变异
  14. 淘集集官宣破产,创业不易,且行且珍惜
  15. 网络摄像头IPC国标GB28181协议国标安防视频流媒体平台EasyGBS视频流不上线排查步骤
  16. 2021版王道数据结构课后代码题全部实现
  17. c 语言 蒙特卡洛程序,蒙特卡洛步骤学习(一)
  18. initramfs学习
  19. MySQL创建用户,更改密码
  20. “AI+”将比“互联网+”落地更容易

热门文章

  1. Laravel源码学习文章汇总
  2. e会学中C语言课程考试答案,管理信息系统期末考试A试卷答案卷
  3. 深入理解SpringBoot (4)
  4. @Resource注解使用详解
  5. 关于@Mapper注解的几个问题
  6. mysql数据库相关
  7. 使用iText来生成PDF
  8. mipi 调试经验【转】
  9. 润乾数据集调用postgresql存储过程
  10. java 空心菱形