寫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.shls: liqiu: no
such file or directory
10
1 說明`ls liqiu > /tmp/error`執行錯誤,0 說明ls -l > /tmp/log執行成功。那麼希望的記過是/tmp/error報錯錯誤日誌,/tmp/log儲存正確的結果,可檢視檔案發現不是這麼回事。
@~ $ more /tmp/logtotal
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/errorls: 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 ...