日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

trap--shell脚本调试的不二人选

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 trap--shell脚本调试的不二人选 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

trap簡介

trap的格式如下,功能就是捕捉信號,并對信號進行處理

trap [-lp] [[arg] sigspec ...]
  • arg可以是shell命令或者自定義函數
  • sigspec可以是以下的一個或多個
  • 定義在<signal.h>中的信號名或者數值。信號名的大小寫不敏感,SIG這個前綴也是可選的。以下的命令的效果都是一樣的
trap "echo SIGINT" SIGINT trap "echo SIGINT" sigint trap "echo SIGINT" 2 trap "echo SIGINT" int trap "echo SIGINT" Int

調試腳本時,trap經常用到的信號量

  • EXIT:在shell退出前執行trap設置的命令,也可以指定為0
  • RETURN:在.和``source執行其他腳本返回時,執行trap`設置的命令
  • DEBUG:在任何命令執行前執行trap設置的命令,但對于函數僅在函數的第一條命令前執行一次
  • ERR:在命令結果為非0時,執行trap設置的命令
#! /bin/bash # 使用trap實現在每個函數開始之前打印以便打印,這樣就能準確的定位到函數的位置 # 從而實現對腳本的調試 trap "echo before a func is called" DEBUG # 當. 或者 source 調用結束的時候出發 trap "echo . or source is called " RETURN func() {echo "不管你信不信,這是一個函數"exit 0 } # 測試 echo "call ." . traptest# 函數的調用 func # DEBUG 查看調試信號是否有效的設置了 # trap -p RETURN # trap -p DEBUGexit 0

執行結果

andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap_func.sh before a func iis called before a func iis called call . before a func iis called . or source is called before a func iis called 不管你信不信,這是一個函數
  • trap -l:列出所有信號的數值和名字,類似于kill -l
andrew@andrew-Thurley:~$ trap -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) 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 -p:列出通過trap設置過的信號處理命令
andrew@andrew-Thurley:~$ trap -p trap -- 'name ' SIGINT trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU trap -- 'name ' RETURN trap "" sigspec :忽略sigspec指定的信號 trap "do something" sigspec:收到sigspec指定的信號時,do some thing后,繼續執行后續命令。 trap sigspec or trap - sigspec:恢復sigspec指定的信號的默認行為

注意

  • 在函數中設置的trap也是全局生效的
#!/bin/bash # trap設置在函數中的tap也是全局有效的 foo() { trap "echo func is called" DEBUG }# 輸出 func is called foo # 調試觸發 #trap -p DEBUG # 輸出trap -- 'echo func is called' SIGINT exit 0
  • 對于同一個信號,只有最后一次trap生效
  • trap只在本進程內有效,它的子進程不會繼承trap的設置。

使用trap設計一個用于反應程序執行過程的腳本

#!/bin/bash # 使用trap來捕捉變量值.# EXIT代表在函數退出前,執行trap trap 'echo Variable Listing --- ret=${ret}' EXITps -A if [ $? == 0 ];thenecho "commond exec OK!"ret=0 elseret=1 fiecho "注意這里,還沒有調用trap"# trap是在退出的時候清理程序時調用的 exit 0

關注,沒有廣告,還能要資料

總結

以上是生活随笔為你收集整理的trap--shell脚本调试的不二人选的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。