人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

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

發(fā)布日期:2022-02-07 15:59 | 文章來(lái)源:源碼中國(guó)

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

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

> bash -x debug.sh 
+ echo 'First line'
First line # 輸出結(jié)果沒(méi)有加號(hào)
++ date # 先執(zhí)行命令替換 兩個(gè)加號(hào)是因?yàn)樵撁钋短自趀cho中
+ 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.

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

> 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)錯(cuò)誤時(shí)執(zhí)行預(yù)設(shè)的操作, 例如打印出錯(cuò)的命令:

trap 'echo $BASH_COMMAND' ERR

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

高級(jí)調(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)用 否則無(wú)輸出
exit 0

運(yùn)行該腳本可以得到以下輸出:

Level0 11 func2 call.sh # func1 的直接調(diào)用者
Level1 15 func3 call.sh # 一層間接調(diào)用
Level2 18 main call.sh # 二層間接調(diào)用
Level3 # 無(wú)輸出 因?yàn)闆](méi)有第三層調(diào)用

局部調(diào)試

可以通過(guò)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ù)表

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

調(diào)試用的參數(shù)可以在運(yùn)行中動(dòng)態(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

通過(guò)使用-f選項(xiàng)可以顯著減少腳本中的轉(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   # 選項(xiàng) x 還可以用于顯示詳細(xì)錯(cuò)誤信息
> 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

默認(rèn)調(diào)試

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

#!/bin/bash -xv

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

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

設(shè)置選項(xiàng)輔助調(diào)試

為了方便調(diào)試,我們可以使用set命令對(duì)bash的選項(xiàng)進(jìn)行設(shè)置:

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

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

引用為定義變量時(shí)報(bào)錯(cuò):

> unset $VAR;echo $VAR
> set -u # 等價(jià)于 set -o nounset
> echo $var
bash: var: unbound variable

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

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

設(shè)置不解析通配符:

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

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

香港服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部