国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

詳解bash中的腳本調試機制

發(fā)布時(shí)間:2023-05-25 09:14 來(lái)源:西部 閱讀:83 作者:西部數碼 欄目: 虛擬主機 歡迎投稿:712375056

服務(wù)器

以調試模式運行腳本

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

> bash -x debug.sh 
  echo \'First line\'
First line # 輸出結果沒(méi)有加號
   date # 先執行命令替換 兩個(gè)加號是因為該命令嵌套在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.

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

> 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)鍵字在解釋執行每一行腳本之前執行指定的命令或函數:

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)鍵字用于在解釋出現錯誤時(shí)執行預設的操作, 例如打印出錯的命令:

trap \'echo $BASH_COMMAND\' ERR

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

高級調試

查看函數調用信息

在函數中使用內置命令caller能夠把函數的調用信息輸出到stdout, 但要注意該命令必須在函數內部調用.

#!/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 # 必須在函數中調用 否則無(wú)輸出
exit 0

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

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

局部調試

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

set -x
date
set  x
> bash script1.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

調試參數表

短命令 長(cháng)命令 效果

set -f
set -o noglob
對文件名停用元字符匹配

set -v
set -o verbose
打印輸入的命令

set -x
set -o xtrace
命令行首打印 ,執行出錯會(huì )打印詳細信息

調試用的參數可以在運行中動(dòng)態(tài)疊加或刪除:

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

通過(guò)使用-f選項可以顯著(zhù)減少腳本中的轉義字符:

> 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

默認調試

也可以直接在腳本第一行添加參數讓腳本默認以調試模式啟動(dòng):

#!/bin/bash -xv

還可以在可能出錯的命令前用echo輸出調試信息:

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

設置選項輔助調試

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

> set -o # 查看所有選項的開(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

常用調試選項

引用為定義變量時(shí)報錯:

> unset $VAR;echo $VAR

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

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

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

設置不解析通配符:

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

到此這篇關(guān)于詳解bash中的腳本調試機制的文章就介紹到這了,更多相關(guān)bash 腳本調試 內容請搜索特網(wǎng)科技以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持特網(wǎng)科技!

更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問(wèn)題,請訪(fǎng)問(wèn)特網(wǎng)科技官網(wǎng):wap.friendlycc.com.cn

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

天天摸天天做天天爽天天弄| 亚洲精品中文字幕无码蜜桃| 又黄又爽又高潮免费毛片| 草草影院永久线路CCYY| 国产无套粉嫩白浆在线| 亚洲成A人片在线观看无码3D|