標籤:des style blog io color 使用 sp strong 檔案
寫SHELL好久了,經常被異常困擾,可竟然堅持了若干年沒用過,回想以前服務過的公司,阿彌陀佛,罪過罪過。廢話少說,希望此篇文章可以協助大家和我徹底結束SHELL指令碼就是LINUX命令集合的初級階段。
一、STDOUT、STDERR
如果要擷取SHELL指令碼的異常輸出,就需要首先理解SHELL命令的標準輸出STDOUT、標準錯誤STDERR。
當我們在編寫 shell 指令碼時,我們會非常頻繁地操作執行命令的標準輸入stdin、標準輸出stdout、標準錯誤stderr。當我們執行指令檔或者執行一個 shell 命令的時候,單從終端輸出我們很難區分哪些是標準輸出,哪些是標準錯誤。所以我們把這些資訊重新導向特定的地方,以便於我們分析指令檔及 shell 命令的執行情況,這就用到了檔案描述符。檔案描述符是與開啟檔案或者資料流相關聯的整數,0、1、2 是系統保留的三個檔案描述符,分別對應標準輸入、標準輸出、標準錯誤。Linux Shell 使用 " > " ">>" 進行對檔案描述符進行重定位。例如代碼:
#!/bin/bashls liqiu > /tmp/error #很明顯這是一個錯誤的命令echo $? #捕獲上一條命令的輸出 (if 0 正常 else 錯誤)ls -l > /tmp/logecho $?
輸出結果:
@~ $ ~/study/test.sh ls: liqiu: No such file or directory10
1 說明`ls liqiu > /tmp/error`執行錯誤,0 說明ls -l > /tmp/log執行成功。那麼希望的記過是/tmp/error報錯錯誤記錄檔,/tmp/log儲存正確的結果,可查看檔案發現不是這麼回事。
@~ $ more /tmp/log total 0drwx------ 3 liqiu staff 102 4 26 2014 Applicationsdrwx------+ 4 liqiu staff 136 11 2 17:06 Desktopdrwxr-xr-x 4 liqiu staff 136 10 18 09:56 svn@~ $ more /tmp/error @~ $
原因在於:重定位元運算符 ">" 的預設參數為標準輸出 stdout ,即 1 ; 所以 ">" 等價於 "1>"; 上面的代碼等價於:
#!/bin/bashls liqiu 1> /tmp/errorecho $? #捕獲上一條命令的輸出 (if 0 正常 else 錯誤)ls -l 1> /tmp/logecho $?
二、捕獲異常
所以要捕獲異常,需要修改代碼:
#!/bin/bashls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把標準錯誤 stderr 重新導向到標準輸出 stdout ;echo $? #捕獲上一條命令的輸出 (if 0 正常 else 錯誤)ls -l > /tmp/logecho $?
執行之後,發現錯誤資訊出現在了檔案/tmp/log中。
@~ $ cat /tmp/error ls: liqiu: No such file or directory@~ $
SHELL異常處理