最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解bash中的腳本調(diào)試機制

 更新時間:2020年03月27日 08:25:43   作者:1996scarlet  
這篇文章主要介紹了bash中的腳本調(diào)試機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

以調(diào)試模式運行腳本

通過bash -x <script>的方式可以在調(diào)試模式下運行整個腳本, bash會在在運行前打印出了每一行命令, 而且每行前面用+號表明命令的嵌套層數(shù).

> bash -x debug.sh 
+ echo 'First line'
First line # 輸出結(jié)果沒有加號
++ date # 先執(zhí)行命令替換 兩個加號是因為該命令嵌套在echo中
+ echo 'Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done.'
Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done.

如果腳本比較復雜, 我們可以通過使用環(huán)境變量PS4配合調(diào)試用的內(nèi)置變量用于輸出更加詳細的信息:

> export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
> bash -x debug.sh 
+debug.sh:3:: echo 'First line'
First line
++debug.sh:4:: date
+debug.sh:4:: echo 'Print datetime: Thu 26 Mar 2020 08:35:59 PM CST Done.'
Print datetime: Thu 26 Mar 2020 08:35:59 PM CST Done.

我們也可以使用trap的DEBUG關(guān)鍵字在解釋執(zhí)行每一行腳本之前執(zhí)行指定的命令或函數(shù):

trap 'echo "VARIABLE-TRACE> \$variable = \"$variable\""' DEBUG
variable=29
let variable++
let variable*=5
exit 0

# 輸出如下
VARIABLE-TRACE> $variable = ""
VARIABLE-TRACE> $variable = "29"
VARIABLE-TRACE> $variable = "30"
VARIABLE-TRACE> $variable = "150"

還可以使用trap的ERR關(guān)鍵字用于在解釋出現(xiàn)錯誤時執(zhí)行預設的操作, 例如打印出錯的命令:

trap 'echo $BASH_COMMAND' ERR

但鑒于使用trap進行調(diào)試的執(zhí)行效率過低, 建議在較為復雜的腳本中直接使用調(diào)試選項或者使用bashdb等調(diào)試工具.

高級調(diào)試

查看函數(shù)調(diào)用信息

在函數(shù)中使用內(nèi)置命令caller能夠把函數(shù)的調(diào)用信息輸出到stdout, 但要注意該命令必須在函數(shù)內(nèi)部調(diào)用.

#!/usr/bin/bash

func1 () {
  for i in `seq 0 3`
  do
    echo -e "Level$i\t  `caller $i`"
  done
}

func2 () {
  func1
}

func3 () {
  func2
}

func3
caller 0 # 必須在函數(shù)中調(diào)用 否則無輸出
exit 0

運行該腳本可以得到以下輸出:

Level0      11 func2 call.sh  # func1 的直接調(diào)用者
Level1      15 func3 call.sh  # 一層間接調(diào)用
Level2      18 main call.sh   # 二層間接調(diào)用
Level3      # 無輸出 因為沒有第三層調(diào)用

局部調(diào)試

可以通過set命令構(gòu)造局部調(diào)試塊,我們可以按照如下方式添加局部調(diào)試:

set -x
date
set +x
> bash script1.sh # 不需要添加調(diào)試參數(shù)
The script starts now.

+ date
Fri 28 Feb 2020 06:23:04 PM CST
+ set +x

This is a string: black
And this is a number: 9

調(diào)試參數(shù)表

短命令 長命令 效果
set -f set -o noglob 對文件名停用元字符匹配
set -v set -o verbose 打印輸入的命令
set -x set -o xtrace 命令行首打印+,執(zhí)行出錯會打印詳細信息

調(diào)試用的參數(shù)可以在運行中動態(tài)疊加或刪除:

> set -v
> date
date 
Fri 28 Feb 2020 06:54:47 PM CST
> set -x      # 參數(shù)可以累加
date        # -v 的效果
+ date       # -x 的效果
Fri 28 Feb 2020 06:55:37 PM CST
> set +vx      # 取消參數(shù)
set +vx

通過使用-f選項可以顯著減少腳本中的轉(zhuǎn)義字符:

> ls ?
x86_64-pc-linux-gnu-library
> set -f      # 停用元字符匹配
> ls ?
ls: cannot access '?': No such file or directory
> touch ?
> ls ?
'?'
> rm ?
> set +f -x   # 選項 x 還可以用于顯示詳細錯誤信息
> aaa
+ aaa
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/lib/command-not-found -- aaa

Command 'aaa' not found, did you mean:

 command 'aha' from deb aha (0.5-1)
 command 'jaaa' from deb jaaa (0.8.4-4)
 command 'aa' from deb astronomical-almanac (5.6-6)

Try: sudo apt install <deb name>

+ return 127

默認調(diào)試

也可以直接在腳本第一行添加參數(shù)讓腳本默認以調(diào)試模式啟動:

#!/bin/bash -xv

還可以在可能出錯的命令前用echo輸出調(diào)試信息:

echo "debug message: now attempting to start w command"; w # 用 ; 對要執(zhí)行的命令排序
echo "Variable VARNAME is now set to $VARNAME."

設置選項輔助調(diào)試

為了方便調(diào)試,我們可以使用set命令對bash的選項進行設置:

> set -o # 查看所有選項的開關(guān)狀態(tài)
> set -o | grep xtrace
xtrace     off
> set -x # 等價于 set -o xtrace
> set -o | grep xtrace 
+ grep --color=auto xtrace
+ set -o
xtrace     on
> set +x # 等價于 set +o xtrace
+ set +x
> set -o | grep xtrace
xtrace     off

常用調(diào)試選項

引用為定義變量時報錯:

> unset $VAR;echo $VAR

> set -u # 等價于 set -o nounset
> echo $var
bash: var: unbound variable

為防止誤操作覆蓋文件中的數(shù)據(jù), 設置禁止重定向到已經(jīng)存在的文件:

> set -C # 等價于 set -o noclobber
> touch test
> date > test
bash: test: cannot overwrite existing file

設置不解析通配符:

> set -f # 等價于 set -o noglob
> touch *
> ll *
-rw-rw-r-- 1 remilia remilia 0 Mar 1 20:09 '*'

到此這篇關(guān)于詳解bash中的腳本調(diào)試機制的文章就介紹到這了,更多相關(guān)bash 腳本調(diào)試 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在CentOS7上搭建Jenkins+Maven+Git持續(xù)集成環(huán)境的方法

    在CentOS7上搭建Jenkins+Maven+Git持續(xù)集成環(huán)境的方法

    這篇文章主要介紹了在CentOS7上搭建Jenkins+Maven+Git持續(xù)集成環(huán)境的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • linux中配置pptp服務器配置的方法

    linux中配置pptp服務器配置的方法

    下面小編就為大家?guī)硪黄猯inux中配置pptp服務器配置的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 解決ssh遠程登陸linux顯示-bash-4.1$的問題

    解決ssh遠程登陸linux顯示-bash-4.1$的問題

    下面小編就為大家?guī)硪黄鉀Qssh遠程登陸linux顯示-bash-4.1$的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Linux 進程通信之FIFO的實現(xiàn)

    Linux 進程通信之FIFO的實現(xiàn)

    這篇文章主要介紹了Linux 進程通信之FIFO的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • centos下簡單配置安裝Squid 3.0反向代理

    centos下簡單配置安裝Squid 3.0反向代理

    以下安裝及配置均為Sudu所在公司應用中使用的腳本,希望高手們能指正我的一些不足。如果測試過程中發(fā)現(xiàn)了問題請回復或者聯(lián)系我。
    2010-12-12
  • Linux中/var/spool/postfix/maildrop占空間很大的原因解析

    Linux中/var/spool/postfix/maildrop占空間很大的原因解析

    這篇文章主要給大家介紹了關(guān)于Linux中/var/spool/postfix/maildrop占空間很大的原因解析,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Linux使用sed命令替換字符串教程

    Linux使用sed命令替換字符串教程

    在本篇文章中小編給大家分享了關(guān)于Linux下如何使用sed命令替換字符串的相關(guān)知識點內(nèi)容,有需要的朋友們學習下。
    2019-01-01
  • Linux 修改 etc/hosts文件詳細介紹

    Linux 修改 etc/hosts文件詳細介紹

    這篇文章主要介紹了 Linux 修改 etc/hosts文件詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • linux中install命令和cp命令的使用與區(qū)別

    linux中install命令和cp命令的使用與區(qū)別

    相信大家都知道linux中的命令I(lǐng)nstall和cp類似,都可以將文件/目錄拷貝到指定的地點。下面這篇文章就詳細介紹了linux中install命令和cp命令的介紹與區(qū)別。有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • ubuntu中snap包的安裝、更新刪除與簡單使用

    ubuntu中snap包的安裝、更新刪除與簡單使用

    Ubuntu 16.04引入了snap包管理,它是一種全新的軟件包安裝管理方式。它和dpkg/apt有本質(zhì)的區(qū)別。下面這篇文章就來給大家詳細介紹了關(guān)于ubuntu中snap包的安裝、更新刪除與簡單使用的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11

最新評論

太和县| 曲松县| 重庆市| 休宁县| 山阴县| 江川县| 陵水| 古丈县| 忻城县| 东乡县| 浪卡子县| 定襄县| 额济纳旗| 铅山县| 丹棱县| 陕西省| 崇阳县| 巨野县| 长春市| 灵台县| 吴旗县| 蓬溪县| 靖宇县| 阿合奇县| 赤城县| 长乐市| 肇东市| 长沙市| 河津市| 巴塘县| 静乐县| 上栗县| 元氏县| 阿克苏市| 阿克陶县| 安化县| 清远市| 丹棱县| 广宁县| 湛江市| 沙坪坝区|