• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            trap命令使用詳解

            Posted on 2009-12-23 23:29 Prayer 閱讀(934) 評論(0)  編輯 收藏 引用 所屬分類: Shell
            使用trap命令

            trap命令用于捕獲指定的信號并執行預定義的命令。
            其基本的語法是:
            trap 'command' signal
            其中signal是要捕獲的信號,command是捕獲到指定的信號之后,所要執行的命令。可以用kill –l命令看到系統中全部可用的信號名,捕獲信號后所執行的命令可以是任何一條或多條合法的shell語句,也可以是一個函數名。
            shell腳本在執行時,會產生三個所謂的“偽信號”,(之所以稱之為“偽信號”是因為這三個信號是由shell產生的,而其它的信號是由操作系統產生的),通過使用trap命令捕獲這三個“偽信號”并輸出相關信息對調試非常有幫助。


            表 1. shell偽信號
            信號名 何時產生
            EXIT 從一個函數中退出或整個腳本執行完畢
            ERR 當一條命令返回非零狀態時(代表命令執行不成功)
            DEBUG 腳本中每一條命令執行之前

            通過捕獲EXIT信號,我們可以在shell腳本中止執行或從函數中退出時,輸出某些想要跟蹤的變量的值,并由此來判斷腳本的執行狀態以及出錯原因,其使用方法是:
            trap 'command' EXIT 或 trap 'command' 0

            通過捕獲ERR信號,我們可以方便的追蹤執行不成功的命令或函數,并輸出相關的調試信息,以下是一個捕獲ERR信號的示例程序,其中的$LINENO是一個shell的內置變量,代表shell腳本的當前行號。

            $ cat -n exp1.sh
            1 ERRTRAP()
            2 {
            3 echo "[LINE:$1] Error: Command or function exited with status $?"
            4 }
            5 foo()
            6 {
            7 return 1;
            8 }
            9 trap 'ERRTRAP $LINENO' ERR
            10 abc
            11 foo

            其輸出結果如下:

            $ sh exp1.sh
            exp1.sh: line 10: abc: command not found
            [LINE:10] Error: Command or function exited with status 127
            [LINE:11] Error: Command or function exited with status 1

            在調試過程中,為了跟蹤某些變量的值,我們常常需要在shell腳本的許多地方插入相同的echo語句來打印相關變量的值,這種做法顯得煩瑣而笨拙。而通過捕獲DEBUG信號,我們只需要一條trap語句就可以完成對相關變量的全程跟蹤。

            以下是一個通過捕獲DEBUG信號來跟蹤變量的示例程序:

            $ cat –n exp2.sh
            1 #!/bin/bash
            2 trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
            3 a=1
            4 if [ "$a" -eq 1 ]
            5 then
            6 b=2
            7 else
            8 b=1
            9 fi
            10 c=3
            11 echo "end"

            其輸出結果如下:

            $ sh exp2.sh
            before execute line:3, a=,b=,c=
            before execute line:4, a=1,b=,c=
            before execute line:6, a=1,b=,c=
            before execute line:10, a=1,b=2,c=
            before execute line:11, a=1,b=2,c=3
            end

            從運行結果中可以清晰的看到每執行一條命令之后,相關變量的值的變化。同時,從運行結果中打印出來的行號來分析,可以看到整個腳本的執行軌跡,能夠判斷出哪些條件分支執行了,哪些條件分支沒有執行。

            亚洲午夜福利精品久久| 国产精品欧美久久久久无广告 | 蜜桃麻豆WWW久久囤产精品| 少妇熟女久久综合网色欲| 精品综合久久久久久97| 精品久久久久久久| 2020国产成人久久精品| 91精品国产9l久久久久| 久久久久国产一区二区三区| A级毛片无码久久精品免费 | 一本久久a久久精品vr综合| 久久久91精品国产一区二区三区| 一本久久a久久精品综合香蕉| av无码久久久久久不卡网站| 欧美与黑人午夜性猛交久久久| 国内精品久久人妻互换| 久久久久久亚洲精品影院| 亚洲国产精品久久久久婷婷老年| 东方aⅴ免费观看久久av| 欧美精品福利视频一区二区三区久久久精品 | 久久这里的只有是精品23| 久久精品国产亚洲欧美| 少妇高潮惨叫久久久久久| 久久人妻少妇嫩草AV蜜桃| 国产成人久久777777| 久久精品成人免费网站| 精品熟女少妇av免费久久| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲伊人久久成综合人影院| 久久精品免费观看| 国产亚洲精久久久久久无码| 久久中文骚妇内射| 欧洲精品久久久av无码电影 | 一本一道久久精品综合| 精品久久8x国产免费观看| 国产精品无码久久综合| 久久97精品久久久久久久不卡| 国产精品99精品久久免费| 国产精品久久免费| 品成人欧美大片久久国产欧美| 国产成人久久777777|