SHELL異常處理(轉載)

 寫SHELL很久了,常常被異常困擾,可居然堅持了若干年沒用過,回想之前服務過的公司,阿彌陀佛,罪過罪過。廢話少說,但願此篇文章能夠協助你們和我完全結束SHELL腳本就是LINUX命令集合的初級階段。html

1、STDOUT、STDERR

  若是要獲取SHELL腳本的異常輸出,就須要首先理解SHELL命令的標準輸出STDOUT、標準錯誤STDERR。shell

  當咱們在編寫 shell 腳本時,咱們會很是頻繁地操做執行命令的標準輸入stdin、標準輸出stdout、標準錯誤stderr。當咱們執行腳本文件或者執行一個 shell 命令的時候,單從終端輸出咱們很難區分哪些是標準輸出,哪些是標準錯誤。因此咱們把這些信息重定向特定的地方,以便於咱們分析腳本文件及 shell 命令的執行狀況,這就用到了文件描述符。文件描述符是與打開文件或者數據流相關聯的整數,0、一、2 是系統保留的三個文件描述符,分別對應標準輸入、標準輸出、標準錯誤。Linux Shell 使用 " > " ">>" 進行對文件描述符進行重定位。例如代碼:bash

#!/bin/bash
ls liqiu > /tmp/error #很明顯這是一個錯誤的命令
echo $? #捕獲上一條命令的輸出 (if 0 正常 else 錯誤)
ls -l > /tmp/log
echo $?

輸出結果:svn

@~ $ ~/study/test.sh 
ls: liqiu: No such file or directory
1
0

  1 說明`ls liqiu > /tmp/error`執行錯誤,說明ls -l > /tmp/log執行成功。那麼但願的記過是/tmp/error報錯錯誤日誌,/tmp/log保存正確的結果,可查看文件發現不是這麼回事。spa

複製代碼
@~ $ more /tmp/log 
total 0
drwx------   3 liqiu  staff   102  4 26  2014 Applications
drwx------+  4 liqiu  staff   136 11  2 17:06 Desktop
drwxr-xr-x   4 liqiu  staff   136 10 18 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 $?

2、捕獲異常

  因此要捕獲異常,須要修改代碼:code

#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把標準錯誤 stderr 重定向到標準輸出 stdout ;
echo $? #捕獲上一條命令的輸出 (if 0 正常 else 錯誤)
ls -l > /tmp/log
echo $?

  執行以後,發現錯誤信息出如今了文件/tmp/log中。htm

@~ $ cat /tmp/error 
ls: liqiu: No such file or directory
@~ $

轉載地址:http://www.javashuo.com/article/p-oqwrogzo-bk.htmlblog

 寫SHELL很久了,常常被異常困擾,可居然堅持了若干年沒用過,回想之前服務過的公司,阿彌陀佛,罪過罪過。廢話少說,但願此篇文章能夠協助你們和我完全結束SHELL腳本就是LINUX命令集合的初級階段。get

1、STDOUT、STDERR

  若是要獲取SHELL腳本的異常輸出,就須要首先理解SHELL命令的標準輸出STDOUT、標準錯誤STDERR。

  當咱們在編寫 shell 腳本時,咱們會很是頻繁地操做執行命令的標準輸入stdin、標準輸出stdout、標準錯誤stderr。當咱們執行腳本文件或者執行一個 shell 命令的時候,單從終端輸出咱們很難區分哪些是標準輸出,哪些是標準錯誤。因此咱們把這些信息重定向特定的地方,以便於咱們分析腳本文件及 shell 命令的執行狀況,這就用到了文件描述符。文件描述符是與打開文件或者數據流相關聯的整數,0、一、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
1
0

  1 說明`ls liqiu > /tmp/error`執行錯誤,說明ls -l > /tmp/log執行成功。那麼但願的記過是/tmp/error報錯錯誤日誌,/tmp/log保存正確的結果,可查看文件發現不是這麼回事。

複製代碼
@~ $ more /tmp/log 
total 0
drwx------   3 liqiu  staff   102  4 26  2014 Applications
drwx------+  4 liqiu  staff   136 11  2 17:06 Desktop
drwxr-xr-x   4 liqiu  staff   136 10 18 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 $?

2、捕獲異常

  因此要捕獲異常,須要修改代碼:

#!/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
@~ $
相關文章
相關標籤/搜索