Bash 指令碼中的錯誤處理
本文講述了在 Bash 中處理錯誤的一些技巧,如何獲取錯誤程式碼、在執行 時獲得詳細輸出、處理除錯功能和錯誤重定向。使用這些技巧,系統管理員可以使他們的日常工作變得輕鬆。 |
退出狀態
在 Bash 指令碼中,
$?
將列印退出狀態。如果返回零,則表示沒有錯誤。如果不為零,結論就是任務可能存在一些問題。
如下是一個簡單例子:
[root@localhost ~]# cat myscript.sh #!/bin/bash mkdir learning echo $?
如果執行上述指令碼一次,它將列印 0,因為該目錄不存在,因此指令碼將建立它。如果第二次執行該指令碼,將獲得一個非零值,如下所示:
[root@localhost ~]# sh myscript.sh [root@localhost ~]# sh myscript.sh mkdir: cannot create directory ‘learning’: File exists 1
最佳實踐
建議透過將
set -x
新增到
指令碼來啟用除錯模式,如下所示:
[root@localhost ~]# cat test3.sh #!/bin/bash set -x echo "Hello World!" mkdiir testing
然後執行指令碼檢視:
[root@localhost ~]# sh test3.sh + echo 'Hello World!' Hello World! + mkdiir testing test3.sh: line 4: mkdiir: command not found
可以編寫如下除錯函式,這有助於隨時呼叫它,使用以下示例:
[root@localhost ~]# cat debug.sh #!/bin/bash _DEBUG="on" function DEBUG() { [ "$_DEBUG" == "on" ] && $@ } DEBUG echo 'Testing Debugging' DEBUG set -x a=2 b=3 c=$(( $a + $b )) DEBUG set +x
輸出內容如下:
[root@localhost ~]# sh debug.sh Testing Debugging + a=2 + b=3 + c=5 + DEBUG set +x + '[' on == on ']' + set +x 2 + 3 = 5
錯誤重定向
可以使用標準錯誤輸出將所有系統錯誤重定向到自定義檔案,標準錯誤可以用數字 2 表示。在 Bash shell 執行它,如下所示:
[root@localhost ~]# mkdir users 2> errors.txt [root@localhost ~]# cat errors.txt mkdir: cannot create directory ‘users’: File exists
大多數時候,很難在指令碼中找到確切的行號。要列印帶有錯誤的行號,請使用
PS4
選項,其中的
$LINENO
是預定義好的變數。
[root@localhost ~]# cat test3.sh #!/bin/bash PS4='$LINENO: ' set -x echo "Hello World!" mkdiir testing
可以在閱讀錯誤時輕鬆檢視行號:
[root@localhost ~]# sh test3.sh 5: echo 'Hello World!' Hello World! 6: mkdiir testing test3.sh: line 6: mkdiir: command not found
總結
本文講述了在 Bash 指令碼中處理錯誤的一些技巧,如何獲取錯誤程式碼、在執行指令碼時獲得詳細輸出、處理除錯功能和錯誤重定向。使用這些技巧,系統管理員可以使他們的日常工作變得輕鬆。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524109/viewspace-2913716/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 處理Apache日誌的Bash指令碼Apache指令碼
- 一個java中呼叫bash指令碼錯誤的診斷Java指令碼
- Restful API 中的錯誤處理RESTAPI
- 【譯】RxJava 中的錯誤處理RxJava
- grpc中的錯誤處理RPC
- javascript中的錯誤處理機制JavaScript
- 應用中的錯誤處理概述
- dbstart&dbshut指令碼中的錯誤指令碼
- 錯誤碼全域性處理(一)
- 錯誤碼全域性處理(二)
- 錯誤處理
- 談談RxSwift中的錯誤處理Swift
- pl/sql中錯誤的異常處理SQL
- go的錯誤處理Go
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- Laravel Excpetions(錯誤處理) 原始碼分析Laravel原始碼
- PHP 錯誤處理PHP
- php錯誤處理PHP
- Go 錯誤處理Go
- Swift錯誤處理Swift
- Zabbix錯誤處理
- mysqldump錯誤處理MySql
- Rust中錯誤處理的最簡單指南Rust
- OGG 配置過程中的錯誤處理
- 如何優雅的在 koa 中處理錯誤
- axios 的錯誤處理iOS
- COM的錯誤處理 (轉)
- 關於 Bash 指令碼中 Shebang 的趣事指令碼
- Bash指令碼指令碼
- Qt處理中文編碼出現錯誤QT
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- 執行指令碼寫入中間表錯誤返回錯誤資訊指令碼
- PHP錯誤處理和異常處理PHP
- Python錯誤處理Python
- 【SYNONYM】ORA-00980錯誤處理暨刪除無效同名的SQL生成指令碼SQL指令碼
- 請教 Element 的錯誤處理
- JavaScript的錯誤簡易處理JavaScript
- 【翻譯】在Spring WebFlux中處理錯誤SpringWebUX