欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    10 分鐘學(xué)會(huì) Bash 調(diào)試

    shell 是用戶和操作系統(tǒng)交互的一個(gè)程序,經(jīng)常用于執(zhí)行一些自動(dòng)化或者重復(fù)繁瑣的任務(wù),現(xiàn)在所有的 Linux 系統(tǒng)基本都自帶了該程序,我們只需要編寫好shell腳本,直接執(zhí)行就可以了,不需要額外安裝軟件、配置編譯環(huán)境,可以說使用起來非常的方便,但是它在調(diào)試方面常常令人頭大,本文主要介紹shell腳本常用的調(diào)試方法

    調(diào)試常用選項(xiàng)

    調(diào)試shell腳本時(shí),常常用到幾個(gè)調(diào)試選項(xiàng),讓腳本在執(zhí)行的過程中,會(huì)輸出一些調(diào)試信息,根據(jù)調(diào)試信息,就可以定位出具體出問題的代碼

    具體的選項(xiàng)以及說明如下:

    選項(xiàng)

    說明

    -x

    輸出結(jié)果之前,先輸出執(zhí)行的命令

    -u

    遇到不存在的變量就會(huì)報(bào)錯(cuò),并停止執(zhí)行

    -e

    發(fā)生錯(cuò)誤時(shí),終止執(zhí)行

    -n

    檢查語(yǔ)法錯(cuò)誤

    -o pipefail

    管道子命令發(fā)生錯(cuò)誤,終止執(zhí)行

    跟蹤腳本的執(zhí)行

    • 輸出調(diào)試信息

    通常,腳本執(zhí)行之后,只有結(jié)果輸出,當(dāng)運(yùn)行多條命令的時(shí)候,就會(huì)連續(xù)輸出多條結(jié)果,無法分清哪條命令對(duì)應(yīng)哪條結(jié)果, 使用 -x選項(xiàng),會(huì)先輸出將要執(zhí)行的那一行命令的調(diào)試信息,然后再執(zhí)行命令

    現(xiàn)有腳本ta.sh,功能是輸出當(dāng)前日期, 內(nèi)容如下

    #!/bin/bash
    
    echo "today is :"$(date +'%Y-%m-%d')
    

    我們使用 -x 選項(xiàng)來執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# bash -x ta.sh 
    ++ date +%Y-%m-%d
    + echo 'today is :2021-07-10'
    today is :2021-07-10
    

    從結(jié)果中可以看到,在執(zhí)行前打印出了每一行命令,行前面的 + 號(hào)表示調(diào)試信息,它實(shí)際是環(huán)境變量 PS4 的值, PS4 的第一個(gè)字符會(huì)根據(jù)嵌套層次進(jìn)行重復(fù),命令所處的層次越深,前面的 + 號(hào)越多

    結(jié)果中第一行表示執(zhí)行 date +'%Y-%m-%d' 命令,它處于第內(nèi)層,所以打印兩個(gè) + 號(hào) ,第二行表示執(zhí)行 echo "today is :"$(date +'%Y-%m-%d') 命令,它處于外層,只打印一個(gè) + 號(hào)

    把 -x 選項(xiàng)放到 #!/bin/bash 語(yǔ)句后面,執(zhí)行的時(shí)候不帶 -x 也能實(shí)現(xiàn)同樣的效果,上述腳本只需要把 #!/bin/bash 改成 #!/bin/bash -x 即可

    • 輸出行號(hào)

    上面示例中腳本內(nèi)容很少,試想下,如果腳本內(nèi)容達(dá)到了幾百行或者幾千行之后,輸出每一行命令的提示信息,閱讀起來就很費(fèi)勁了,在這種情況下,我們?cè)诿啃休敵銮凹由闲刑?hào),可以直接定位到具體的行

    修改下 ta.sh 腳本,修改后的內(nèi)容如下

    #!/bin/bash 
    
    PS4='+${BASH_SOURCE}:${LINENO} '
    echo "start..."
    set -x
    echo "today is :"$(date +'%Y-%m-%d')
    set +x
    echo "end..."
    
    

    修改之后的腳本加入了 PS4 變量, 它是調(diào)試信息的前綴,默認(rèn)值是 "+", 我們可以修改它的值,達(dá)到輸出的調(diào)試信息中包含行號(hào)的目的

    上述代碼中 "${BASH_SOURCE}" 表示 當(dāng)前執(zhí)行的shell腳本的相對(duì)路徑,在這里用來表示腳本文件名,"${LINENO}" 表示行號(hào),修改 PS4 之后,輸出的調(diào)試信息就會(huì)包括 腳本名字以及行號(hào)

    我們執(zhí)行腳本,看下結(jié)果

    [root@VM-0-2-centos shell_debug]# bash -x ta.sh 
    + PS4='+${BASH_SOURCE}:${LINENO} '
    +ta.sh:4 echo start...
    start...
    ++ta.sh:5 date +%Y-%m-%d
    +ta.sh:5 echo 'today is :2021-07-10'
    today is :2021-07-10
    +ta.sh:6 echo end...
    end...
    

    從結(jié)果可以看出,每一行命令的調(diào)試信息中都包含了文件名和行號(hào)

    • 輸出部分調(diào)試信息

    有時(shí),我們只需要輸出部分調(diào)試信息,這個(gè)時(shí)候就需要我們手動(dòng)去設(shè)置 -x 選項(xiàng)了,把需要輸出調(diào)試信息的命令放到 set -x 和set +x 之間

    修改下 ta.sh 腳本,內(nèi)容如下

    #!/bin/bash
    
    echo "test..."
    
    set -x
    echo "today is :"$(date +'%Y-%m-%d')
    set +x
    
    echo "finish..."
    
    

    執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./ta.sh 
    [root@VM-0-2-centos shell_debug]# ./ta.sh 
    test...
    ++ date +%Y-%m-%d
    + echo 'today is :2021-07-10'
    today is :2021-07-10
    + set +x
    finish...
    

    從結(jié)果可以看出,只有 echo today is :"$(date +'%Y-%m-%d') 命令輸出了調(diào)試信息,set -x 相當(dāng)于開啟調(diào)試信息,set +x 則是關(guān)閉調(diào)試信息

    這里需要注意下,腳本中使用了 set -x 時(shí) , 執(zhí)行的時(shí)候就不要再加 -x 了

    日志打印

    通過打印日志來調(diào)試shell腳本是常用的方式,在一行命令前后打印變量值或者命令結(jié)果,通過日志來判斷是否有錯(cuò)誤

    但是,當(dāng)腳本比較長(zhǎng)的時(shí)候,需要打印的日志就有點(diǎn)兒多了,而且,調(diào)試完了后,這些調(diào)試日志就不再需要了,這時(shí)就要一行行的刪掉日志打印

    下面介紹一種方法,把腳本中所有的日志打印加一個(gè)開關(guān),當(dāng)開關(guān)打開的時(shí)候,就會(huì)輸出調(diào)試相關(guān)的日志,不需要的時(shí)候,直接關(guān)閉開關(guān)即可

    現(xiàn)有腳本 debug1.sh, 內(nèi)容如下

    #!/bin/bash
    
    #調(diào)試開關(guān), on 表示開啟,其他表示關(guān)閉
    IS_DEBUG="on"
    #調(diào)試開關(guān)函數(shù)
    function _DEBUG()
    {
       [ "$IS_DEBUG"=="on" ] && $@
    }
    
    va=1
    _DEBUG echo 'old value:'$va
    #變量val加1
    let va++
    echo 'new value:'$va
    

    上述腳本中,IS_DEBUG變量是調(diào)試開關(guān),"on" 表示開啟,其他表示關(guān)閉

    _DEBUG() 是調(diào)試開關(guān)函數(shù),它的功能是:如果 IS_DEBUG"on" ,執(zhí)行后面的命令,否則忽略

    先打開調(diào)試開關(guān), 執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./debug1.sh 
    old value:1
    new value:2
    

    再關(guān)閉調(diào)試開關(guān),執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./debug1.sh 
    new value:2
    

    從上面兩組測(cè)試結(jié)果可以看出,當(dāng)打開調(diào)試開關(guān),也即設(shè)置 IS_DEBUG="on" 后, 語(yǔ)句 _DEBUG echo 'old value:'$va 會(huì)執(zhí)行 echo 'old value:'$va 命令,當(dāng) IS_DEBUG="off" 時(shí), 就會(huì)忽略 echo 'old value:'$va 命令

    所以,當(dāng)調(diào)試的時(shí)候,打開調(diào)試開關(guān),調(diào)試完成之后,腳本不需要做任何修改,只需要關(guān)閉開關(guān),調(diào)試相關(guān)的命令就都不會(huì)執(zhí)行了

    常見的錯(cuò)誤處理

    • 不存在的變量

    執(zhí)行腳本的時(shí)候,遇到不存在的變量,默認(rèn)會(huì)忽略它

    現(xiàn)有腳本 td.sh, 內(nèi)容如下

    #!/bin/bash
    
    
    echo "start..."
    echo $ta
    echo "end..."
    

    腳本中 ta 是一個(gè)不存在的變量,腳本執(zhí)行結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./td.sh 
    start...
    
    end...
    

    可以看到,echo $ta 輸出了一個(gè)空行,腳本直接忽略了不存在的 ta 變量, 并且繼續(xù)執(zhí)行后面的命令

    這種情況通常并不是我們希望的結(jié)果,遇到不存在的變量,應(yīng)該直接報(bào)錯(cuò),并停止執(zhí)行后面的命令,在腳本開頭加上 set -u 語(yǔ)句或者執(zhí)行腳本的時(shí)候加上 -u ,可以得到我們期望的結(jié)果

    在腳本開頭加上 set -u 語(yǔ)句,整個(gè)腳本內(nèi)容如下

    #!/bin/bash
    
    set -u
    echo "start..."
    echo $ta
    echo "end..."
    

    執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./td.sh 
    start...
    ./td.sh: line 5: ta: unbound variable
    

    可以看到,加了 set -u 語(yǔ)句之后,遇到不存在的變量 ta, 直接報(bào)錯(cuò),并且停止執(zhí)行后面的命令

    當(dāng)然,我們使用 bash -u td.sh 命令執(zhí)行腳本也會(huì)得到相同的結(jié)果

    • 語(yǔ)法錯(cuò)誤

    語(yǔ)法錯(cuò)誤是shell腳本執(zhí)行錯(cuò)誤的原因之一,執(zhí)行腳本的時(shí)候加上 -n, 當(dāng)腳本有語(yǔ)法錯(cuò)誤,不會(huì)繼續(xù)執(zhí)行,而是打印錯(cuò)誤信息

    現(xiàn)有腳本 te.sh, 內(nèi)容如下

    #!/bin/bash
    
    if [ $# -le 0 ];then
       echo "no param.."
    

    輸入 bash -n te.sh 命令,并回車,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# bash -n te.sh 
    te.sh: line 5: syntax error: unexpected end of file
    

    上面的腳本中的 if 缺少結(jié)尾的 fi, 所以執(zhí)行 bash -n te.sh 命令之后會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤的提示

    這個(gè)選項(xiàng)很實(shí)用,特別是當(dāng)我們寫完shell腳本之后,不要急著執(zhí)行,先使用 -n 選項(xiàng)檢查下有沒有語(yǔ)法錯(cuò)誤,它可以幫我們提前發(fā)現(xiàn)錯(cuò)誤

    • 發(fā)生錯(cuò)誤,終止執(zhí)行

    一般情況下,腳本執(zhí)行時(shí)發(fā)生錯(cuò)誤了,還是會(huì)繼續(xù)執(zhí)行后面的命令

    現(xiàn)有腳本 tf.sh, 內(nèi)容如下

    #!/bin/bash
    
    echo "start..."
    abc
    echo "end..."
    

    執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# ./tf.sh 
    start...
    ./tf.sh: line 4: abc: command not found
    end...
    

    從結(jié)果可以看到,腳本中第四行的 abc 是未知的命令,執(zhí)行時(shí)發(fā)生了錯(cuò)誤,但是腳本還是繼續(xù)向后執(zhí)行,一直到結(jié)束

    這種行為不利于腳本的安全和錯(cuò)誤排查,在實(shí)際應(yīng)用中,發(fā)生了錯(cuò)誤應(yīng)該停止執(zhí)行腳本,防止錯(cuò)誤越積越多,我們可以使用 -e 選項(xiàng)來避免這個(gè)問題

    加上 -e 選項(xiàng),再次執(zhí)行上述腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# bash -e ./tf.sh 
    start...
    ./tf.sh: line 4: abc: command not found
    

    從上面結(jié)果可以知道,腳本執(zhí)行到第四行的時(shí)候發(fā)生了錯(cuò)誤,此時(shí)腳本停止往下執(zhí)行了

    • 管道子命令失敗,終止執(zhí)行

    上面提到的 -e 選項(xiàng)有個(gè)特殊的情況,不適用于管道命令,管道命令是通過管道符 "|" 組合的命令, 具體的看下面的例子吧

    現(xiàn)有腳本 tg.sh, 內(nèi)容如下

    #!/bin/bash
    
    echo "start..."
    abc | echo "111"
    echo "end..."
    

    腳本的第四行, abc | echo "111" 是管道命令,我們執(zhí)行 bash -e ./tg.sh 命令后,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# bash -e ./tg.sh 
    start...
    ./tg.sh: line 4: abc: command not found
    111
    end...
    

    可以看到,即使使用 -e 選項(xiàng)執(zhí)行腳本,發(fā)生錯(cuò)誤的時(shí)候,還是會(huì)繼續(xù)往下執(zhí)行,直到結(jié)束

    我們使用 set -o pipefail 來解決這種情況,只要管道命令中一個(gè)子命令發(fā)生了錯(cuò)誤,整個(gè)管道命令就失敗了,腳本就會(huì)終止執(zhí)行

    修改下上述腳本,內(nèi)容如下

    #!/bin/bash
    
    set -o pipefail
    echo "start..."
    abc | echo "111"
    echo "end..."
    

    再次執(zhí)行腳本,結(jié)果如下

    [root@VM-0-2-centos shell_debug]# bash -e tg.sh 
    start...
    tg.sh: line 5: abc: command not found
    111
    

    可以看到,在 tg.sh 腳本開頭加上 set -o pipefail 語(yǔ)句之后,再次執(zhí)行腳本, 管道命令 abc | echo "111" 執(zhí)行子命令 abc 時(shí)發(fā)生錯(cuò)誤,后續(xù)的子命令不再執(zhí)行了,整個(gè)管道命令失敗了

    由于執(zhí)行時(shí)加了 -e 選項(xiàng),當(dāng)管道命令執(zhí)行失敗了,腳本就會(huì)終止執(zhí)行,所以 echo "end..." 沒有執(zhí)行


    - EOF -

    如何在 Automator 中創(chuàng)建自動(dòng)刪除下載

    Apple 在所有 Mac 上都隨 macOS 提供了預(yù)載 Automator 應(yīng)用程序,通過它,你可以在 Mac 上自動(dòng)執(zhí)行重復(fù)性任務(wù),不用手動(dòng)傻傻處理。

    Automator 支持多種類型任務(wù),本教學(xué)所用到的是文件夾操作自動(dòng)化,每次對(duì)指定文件夾進(jìn)行指定操作。 這次我們舉的例子是「自動(dòng)從下載文件夾中刪除超過 7 天的所有文件與文件夾」,請(qǐng)依照下面的步驟按部就班完成。

    動(dòng)作一、設(shè)置文件夾操作

    • 若要?jiǎng)?chuàng)建文件夾操作,請(qǐng)先打開 Mac 上的 Automator 應(yīng)用程序。

    • 類型部分點(diǎn)選「文件夾動(dòng)作」。

    • 點(diǎn)擊頂部最右側(cè)的下拉菜單,然后點(diǎn)選「其他」,再選擇「下載」文件夾。

    動(dòng)作二、找到要?jiǎng)h除的文件

    有兩種方法可以從「下載」文件夾中尋找文檔和文件夾,一種是「查找 Finder 對(duì)象」,第二種方法則利用「執(zhí)行 Shell 工序指令」。 因?yàn)榍罢咴谶@次沒有幫助,所以我們教大家使用后者。

    • 在上面搜索「Shell」,然后將找到的「執(zhí)行 Shell 程序命令」拖曳到最右側(cè)邊欄中。

    • Shell 旁的下拉菜單選擇「/bin/bash」。

    • 下面的輸入方塊中請(qǐng)復(fù)制貼上以下的命令。 「+7d」表示該操作將查找超過 7 天的文件,你可以將其變更為自己喜歡的任何時(shí)間范圍。 例如,+30d 只會(huì)刪除一個(gè)月以上的檔案。 你還要修改下載目錄的位置,將它替換成 Mac 上下載文件夾的路徑(開啟 Finder,在左側(cè)邊欄的下載上點(diǎn)鼠標(biāo)右鍵點(diǎn)擊取得信息,查看「位置」)。

    find “下載目錄的位置/Downloads” -ctime +7d -o -mtime +7d -iname '*.*'

    • 貼好、修改好后,點(diǎn)擊一下最頂部右上的「運(yùn)行」。

    • 如果你所做的一切正確,完成后點(diǎn)擊「結(jié)果」即可查看從下載文件夾中搜出來符合條件的文件文件。

    動(dòng)作三、自動(dòng)刪除文件

    在前一個(gè)動(dòng)作我們已經(jīng)看到自動(dòng)查找符合條件檔案的能力,接下來請(qǐng)繼續(xù)將最終自動(dòng)操作新增到工作流程中。

    • 在搜索字段中輸入「將 Finder 項(xiàng)目丟到垃圾桶」,然后拖曳到最右欄,放在我們前一動(dòng)作已經(jīng)配置好的 Shell 下面以建立連接起來的工作流程。

    • 最后,點(diǎn)擊最上面的文件,然后點(diǎn)擊「保存」。

    • 為文件夾動(dòng)作命名后點(diǎn)擊儲(chǔ)存。 macOS 將所有 Automator 文件夾操作保存在「~/Library/Workflows/Applications/Folder Actions/」路徑下。

    • 儲(chǔ)存后,完成。 未來文件在下載文件夾中待了 7 天以上的現(xiàn)有文件都會(huì)自動(dòng)被移到垃圾桶。

    別忘了也要定期清理回收站

    由于上面我們做的文件夾操作自動(dòng)化流程會(huì)將下載文件夾中超過 7 天的文件丟到回收桶,所以你一定要記得每隔一段時(shí)間就清一次回收桶,否則回收桶中會(huì)塞滿垃圾。 當(dāng)然你還可以依樣畫葫蘆地自己設(shè)定自動(dòng)化30天清空一次回收桶的操作,一切看你方便。

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有