日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

shell腳本常用的調(diào)試方法介紹

開關(guān)電源芯片 ? 來源:Linux開發(fā)那些事兒 ? 作者:LinuxThings ? 2021-09-01 10:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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 檢查語法錯(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語句后面,執(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"后, 語句_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語句或者執(zhí)行腳本的時(shí)候加上-u,可以得到我們期望的結(jié)果

在腳本開頭加上set -u語句,整個(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語句之后,遇到不存在的變量ta, 直接報(bào)錯(cuò),并且停止執(zhí)行后面的命令

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

語法錯(cuò)誤

語法錯(cuò)誤是shell腳本執(zhí)行錯(cuò)誤的原因之一,執(zhí)行腳本的時(shí)候加上-n, 當(dāng)腳本有語法錯(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)語法錯(cuò)誤的提示

這個(gè)選項(xiàng)很實(shí)用,特別是當(dāng)我們寫完shell腳本之后,不要急著執(zhí)行,先使用-n選項(xiàng)檢查下有沒有語法錯(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語句之后,再次執(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í)行

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    653

    瀏覽量

    35922
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    412

    瀏覽量

    29287

原文標(biāo)題:10 分鐘學(xué)會(huì) Bash 調(diào)試

文章出處:【微信號(hào):gh_3980db2283cd,微信公眾號(hào):開關(guān)電源芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    變頻器維修檢測(cè)的常用方法

    變頻器作為現(xiàn)代工業(yè)控制系統(tǒng)中不可或缺的核心設(shè)備,其穩(wěn)定運(yùn)行直接關(guān)系到生產(chǎn)效率和設(shè)備安全。隨著變頻器在電機(jī)調(diào)速、節(jié)能降耗等領(lǐng)域的廣泛應(yīng)用,維修檢測(cè)技術(shù)的重要性日益凸顯。本文將系統(tǒng)介紹變頻器維修檢測(cè)的常用方法,結(jié)合實(shí)踐經(jīng)驗(yàn)和專業(yè)技術(shù)
    的頭像 發(fā)表于 03-13 17:11 ?878次閱讀

    DR1平臺(tái)Linux應(yīng)用開發(fā)指南:含GDB調(diào)試、Python及MQTT實(shí)戰(zhàn)

    流程,以及 LED、按鍵、CAN、TCP/UDP、串口等常用開發(fā)案例,同時(shí)覆蓋 Python 腳本開發(fā)與 MQTT 消息發(fā)布 / 訂閱實(shí)戰(zhàn)。文檔基于 Ubuntu22.04
    的頭像 發(fā)表于 01-05 16:48 ?4852次閱讀
    DR1平臺(tái)Linux應(yīng)用開發(fā)指南:含GDB<b class='flag-5'>調(diào)試</b>、Python及MQTT實(shí)戰(zhàn)

    【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-紅綠燈項(xiàng)目-實(shí)現(xiàn)開機(jī)起動(dòng)

    0接上文【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-紅綠燈項(xiàng)目 Linux 起動(dòng)系統(tǒng)下 init 系統(tǒng)大多數(shù) Linux 發(fā)行版
    發(fā)表于 11-03 17:25

    關(guān)于系統(tǒng)鏈接腳本介紹

    一、隊(duì)伍介紹 本篇為蜂鳥E203系列分享第四篇,本篇介紹的內(nèi)容是系統(tǒng)鏈接腳本。 二、如何實(shí)現(xiàn)不同的下載模式? 實(shí)現(xiàn)三種不同的程序運(yùn)行方式,可通過makefile的命令行指定不同的鏈接腳本
    發(fā)表于 10-30 08:26

    【技術(shù)分享】正確編寫SysV Init腳本以實(shí)現(xiàn)Systemd兼容(上)

    嵌入式的ubuntu系統(tǒng)如何寫好SysVInit腳本呢?與system服務(wù)又有什么差別呢?一起隨著文章來探究吧。問題背景許多傳統(tǒng)Linux服務(wù)仍使用SysVInit腳本(/etc/init.d
    的頭像 發(fā)表于 10-28 11:45 ?854次閱讀
    【技術(shù)分享】正確編寫SysV Init<b class='flag-5'>腳本</b>以實(shí)現(xiàn)Systemd兼容(上)

    如何使用CMSIS DAP仿真器調(diào)試,通過NucleiStudio調(diào)試蜂鳥SOC

    如標(biāo)題所示,我們分享如何使用CMSIS DAP仿真器調(diào)試,通過NucleiStudio調(diào)試蜂鳥SOC 我們先介紹一下CMSIS DAP仿真器: 他的功能如下: 可以看到,它支持JTAG接口協(xié)議
    發(fā)表于 10-21 12:05

    使用jQuery的常用方法與返回值分析

    使用jQuery的常用方法與返回值分析 jQuery是一個(gè)輕量級(jí)的JavaScript庫(kù),旨在簡(jiǎn)化HTML文檔遍歷和操作、事件處理以及動(dòng)畫效果的創(chuàng)建。本文將介紹一些常用的jQuery
    發(fā)表于 10-01 20:18

    shell基本介紹常用命令之shell基本介紹

    是“$”,在命令提示符后邊輸入命令即可和系統(tǒng)進(jìn)行交互操作。ubuntu默認(rèn)的Shell是Bash(Bourne Again Shell)。Linux命令有很多,功能比較強(qiáng)大,下節(jié)我們簡(jiǎn)單介紹一些
    發(fā)表于 09-28 09:05

    【RA-Eco-RA6M4開發(fā)板評(píng)測(cè)】移植shell實(shí)現(xiàn)命令交互

    代碼見 一. 前言前面我們實(shí)現(xiàn)了標(biāo)準(zhǔn)輸入輸出,為了進(jìn)一步方便交互調(diào)試,我們繼續(xù)來實(shí)現(xiàn)一個(gè)精簡(jiǎn)的shell。Shell的實(shí)現(xiàn)參考https://mp.weixin.qq.com/s
    發(fā)表于 07-19 22:47

    軟件調(diào)試器參考指南

    AMD Vitis IDE 是有助于開發(fā)新處理器架構(gòu)的圖形開發(fā)環(huán)境。它通過邏輯向?qū)Ш?jiǎn)化了常用函數(shù),初學(xué)者也能輕松使用。但這些工具須支持腳本編制,即,這些工具可修改也可擴(kuò)展,從而提供靈活性。如需開發(fā)
    的頭像 發(fā)表于 07-11 14:24 ?1247次閱讀

    常用電子元器件介紹

    電子發(fā)燒友網(wǎng)站提供《常用電子元器件介紹.pptx》資料免費(fèi)下載
    發(fā)表于 06-24 16:54 ?57次下載

    硬件調(diào)試:JLink 驅(qū)動(dòng)配置與調(diào)試技巧

    摘要: 本文深入探討了 JLink 調(diào)試器在嵌入式系統(tǒng)硬件調(diào)試中的應(yīng)用,詳細(xì)闡述了 JLink 驅(qū)動(dòng)配置的方法以及硬件調(diào)試技巧。本文以國(guó)科安芯的AS32系列MCU芯片為例,通過分析 J
    的頭像 發(fā)表于 06-12 23:20 ?1923次閱讀
    硬件<b class='flag-5'>調(diào)試</b>:JLink 驅(qū)動(dòng)配置與<b class='flag-5'>調(diào)試</b>技巧

    Shell腳本入門指南

    Shell 是一塊包裹著系統(tǒng)核心的殼,處于操作系統(tǒng)的最外層,與用戶直接對(duì)話,把用戶的輸入, 解釋給操作系統(tǒng),然后處理操作系統(tǒng)的輸出結(jié)果,輸出到屏幕給與用戶看到結(jié)果。
    的頭像 發(fā)表于 06-03 10:47 ?1411次閱讀
    <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>入門指南

    如何解決Air780EPM開發(fā)中的調(diào)試難題?深度解析高效調(diào)試方法

    在Air780EPM項(xiàng)目開發(fā)中,調(diào)試效率往往直接影響進(jìn)度。面對(duì)代碼報(bào)錯(cuò)、邏輯漏洞等常見痛點(diǎn),開發(fā)者亟需一套系統(tǒng)化的方法論。本文將揭秘實(shí)戰(zhàn)中驗(yàn)證的調(diào)試技巧,助您快速定位問題并優(yōu)化代碼流程。
    的頭像 發(fā)表于 05-17 10:46 ?902次閱讀
    如何解決Air780EPM開發(fā)中的<b class='flag-5'>調(diào)試</b>難題?深度解析高效<b class='flag-5'>調(diào)試</b><b class='flag-5'>方法</b>

    【米爾-RK3562開發(fā)板試用評(píng)測(cè)】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-(綠色)RUN 燈、(紅色)User燈

    在板上使用shell腳本語言簡(jiǎn)單明了開發(fā)效率高便于調(diào)試修改動(dòng)態(tài)性強(qiáng)資源利用靈活但實(shí)時(shí)性不足。 shell腳本是linux中殼層與命
    發(fā)表于 05-09 18:19
    华安县| 金阳县| 洛扎县| 博爱县| 本溪| 通道| 绵竹市| 莆田市| 沁源县| 弥渡县| 衡阳市| 临漳县| 临武县| 绍兴县| 温泉县| 海南省| 湾仔区| 安义县| 九寨沟县| 灵宝市| 汉寿县| 银川市| 宁乡县| 凤翔县| 略阳县| 玛沁县| 罗甸县| 弥勒县| 通海县| 新蔡县| 永兴县| 晋江市| 鸡泽县| 昆明市| 南丰县| 河西区| 驻马店市| 台中县| 临武县| 青河县| 偃师市|