• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            trap命令使用詳解

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

            trap命令用于捕獲指定的信號(hào)并執(zhí)行預(yù)定義的命令。
            其基本的語法是:
            trap 'command' signal
            其中signal是要捕獲的信號(hào),command是捕獲到指定的信號(hào)之后,所要執(zhí)行的命令。可以用kill –l命令看到系統(tǒng)中全部可用的信號(hào)名,捕獲信號(hào)后所執(zhí)行的命令可以是任何一條或多條合法的shell語句,也可以是一個(gè)函數(shù)名。
            shell腳本在執(zhí)行時(shí),會(huì)產(chǎn)生三個(gè)所謂的“偽信號(hào)”,(之所以稱之為“偽信號(hào)”是因?yàn)檫@三個(gè)信號(hào)是由shell產(chǎn)生的,而其它的信號(hào)是由操作系統(tǒng)產(chǎn)生的),通過使用trap命令捕獲這三個(gè)“偽信號(hào)”并輸出相關(guān)信息對(duì)調(diào)試非常有幫助。


            表 1. shell偽信號(hào)
            信號(hào)名 何時(shí)產(chǎn)生
            EXIT 從一個(gè)函數(shù)中退出或整個(gè)腳本執(zhí)行完畢
            ERR 當(dāng)一條命令返回非零狀態(tài)時(shí)(代表命令執(zhí)行不成功)
            DEBUG 腳本中每一條命令執(zhí)行之前

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

            通過捕獲ERR信號(hào),我們可以方便的追蹤執(zhí)行不成功的命令或函數(shù),并輸出相關(guān)的調(diào)試信息,以下是一個(gè)捕獲ERR信號(hào)的示例程序,其中的$LINENO是一個(gè)shell的內(nèi)置變量,代表shell腳本的當(dāng)前行號(hào)。

            $ 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

            其輸出結(jié)果如下:

            $ 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

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

            以下是一個(gè)通過捕獲DEBUG信號(hào)來跟蹤變量的示例程序:

            $ 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"

            其輸出結(jié)果如下:

            $ 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

            從運(yùn)行結(jié)果中可以清晰的看到每執(zhí)行一條命令之后,相關(guān)變量的值的變化。同時(shí),從運(yùn)行結(jié)果中打印出來的行號(hào)來分析,可以看到整個(gè)腳本的執(zhí)行軌跡,能夠判斷出哪些條件分支執(zhí)行了,哪些條件分支沒有執(zhí)行。

            东京热TOKYO综合久久精品 | 狠狠色婷婷综合天天久久丁香| 丁香色欲久久久久久综合网| 久久国产精品一国产精品金尊| 国产成人精品综合久久久| 久久天天躁狠狠躁夜夜2020老熟妇| 久久这里的只有是精品23| 国产精品久久网| 亚洲国产精品久久电影欧美| 狠狠久久综合伊人不卡| 麻豆一区二区99久久久久| 久久婷婷五月综合色99啪ak| 国产精品无码久久久久久| 欧洲性大片xxxxx久久久| 国产精品久久成人影院| 中文成人久久久久影院免费观看| 国产精品久久久久久久| 久久人人爽人人爽人人av东京热 | 日韩精品国产自在久久现线拍 | 日韩人妻无码精品久久免费一| 99国内精品久久久久久久| 久久天天躁狠狠躁夜夜96流白浆 | 久久er99热精品一区二区| 亚洲欧美久久久久9999| 久久国产成人亚洲精品影院| 热re99久久精品国99热| 国产亚洲精品久久久久秋霞| 人妻系列无码专区久久五月天| 久久免费小视频| 国产精品免费福利久久| 久久无码人妻一区二区三区午夜 | 国产成人久久精品二区三区| 狠狠久久亚洲欧美专区| 狠狠色婷婷综合天天久久丁香| 国产99久久精品一区二区| 久久精品国产半推半就| 9191精品国产免费久久| 久久99国产一区二区三区| 人妻系列无码专区久久五月天| 欧美伊人久久大香线蕉综合 | 国产精品久久久久久久久软件|