SHELL異常處理

2021-09-06 19:41:47 字數 1783 閱讀 9826

寫shell好久了,經常被異常困擾,可竟然堅持了若干年沒用過,回想以前服務過的公司,阿彌陀佛,罪過罪過。廢話少說,希望此篇文章可以協助大家和我徹底結束shell指令碼就是linux命令集合的初級階段。

如果要獲取shell指令碼的異常輸出,就需要首先理解shell命令的標準輸出stdout、標準錯誤stderr。

當我們在編寫 shell 指令碼時,我們會非常頻繁地操作執行命令的標準輸入stdin、標準輸出stdout、標準錯誤stderr。當我們執行指令碼檔案或者執行乙個 shell 命令的時候,單從終端輸出我們很難區分哪些是標準輸出,哪些是標準錯誤。所以我們把這些資訊重定向特定的地方,以便於我們分析指令碼檔案及 shell 命令的執**況,這就用到了檔案描述符。檔案描述符是與開啟檔案或者資料流相關聯的整數,0、1、2 是系統保留的三個檔案描述符,分別對應標準輸入、標準輸出、標準錯誤。linux shell 使用 " > " ">>" 進行對檔案描述符進行重定位。例如**:

#

!/bin/bash

ls liqiu > /tmp/error #很明顯這是乙個錯誤的命令

echo $? #

捕獲上一條命令的輸出 (if 0 正常 else 錯誤)

ls -l > /tmp/log

echo $?

輸出結果:

@~ $ ~/study/test.sh 

ls: liqiu: no

such file or directory

10

1 說明`ls liqiu > /tmp/error`執行錯誤,0 說明ls -l > /tmp/log執行成功。那麼希望的記過是/tmp/error報錯錯誤日誌,/tmp/log儲存正確的結果,可檢視檔案發現不是這麼回事。

@~ $ more /tmp/log

total

0drwx------ 3 liqiu staff 102426

2014

drwx------+ 4 liqiu staff 136112

17:06

desktop

drwxr-xr-x

4 liqiu staff 136

1018

09:56

svn@~ $ more /tmp/error

@~ $

原因在於:重定位運算子 ">" 的預設引數為標準輸出 stdout ,即 1 ; 所以 ">" 等價於 "1>"; 上面的**等價於: 

#

!/bin/bash

ls liqiu 1> /tmp/error

echo $? #

捕獲上一條命令的輸出 (if 0 正常 else 錯誤)

ls -l 1> /tmp/log

echo $?

所以要捕獲異常,需要修改**:

#

!/bin/bash

ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把標準錯誤 stderr 重定向到標準輸出 stdout ;

echo $? #

捕獲上一條命令的輸出 (if 0 正常 else 錯誤)

ls -l > /tmp/log

echo $?

執行之後,發現錯誤資訊出現在了檔案/tmp/log中。

@~ $ cat /tmp/error 

ls: liqiu: no

such file or directory

@~ $

struts 異常處理 全域性異常處理

記錄一下全域性異常處理的過程 處理主動丟擲的異常,轉向錯誤提示頁面。1 寫乙個自己的異常,繼承runtimeexception,從父類生成構造方法 package me.yndy.srtp.exception suppresswarnings serial public class errorexc...

python異常處理 Python 異常處理

使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...

01 異常 異常處理

注意 1 對定義的變數能初始化的盡量初始化,如果賦的值可能產生誤導,可以採用可空型別 例如 double?dnumres null 3 異常 執行的時候出現的錯誤,或bug 編寫 的預期條件玉實際條件不穩合 異常的機制是為了保證程式可以一直正常執行。丟擲異常 throw new exception ...