日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bash 抓捕异常_SHELL异常处理(转载)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bash 抓捕异常_SHELL异常处理(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

一、STDOUT、STDERR

如果要獲取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/logecho $?

輸出結果:

@~ $ ~/study/test.sh

ls: liqiu: Nosuch file or directory1

0

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

@~ $ more /tmp/logtotal0drwx------ 3 liqiu staff 102 4 26 2014Applications

drwx------+ 4 liqiu staff 136 11 2 17:06Desktopdrwxr-xr-x 4 liqiu staff 136 10 18 09:56svn

@~ $ more /tmp/error

@~ $

原因在于:重定位運算符 ">" 的默認參數為標準輸出 stdout ,即 1 ; 所以 ">" 等價于 "1>"; 上面的代碼等價于:

#!/bin/bash

ls liqiu 1> /tmp/error

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

ls -l 1> /tmp/logecho $?

二、捕獲異常

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

#!/bin/bash

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

ls -l > /tmp/logecho $?

執行之后,發現錯誤信息出現在了文件/tmp/log中。

@~ $ cat /tmp/error

ls: liqiu: Nosuch file or directory

@~ $

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

一、STDOUT、STDERR

如果要獲取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/logecho $?

輸出結果:

@~ $ ~/study/test.sh

ls: liqiu: Nosuch file or directory1

0

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

@~ $ more /tmp/logtotal0drwx------ 3 liqiu staff 102 4 26 2014Applications

drwx------+ 4 liqiu staff 136 11 2 17:06Desktopdrwxr-xr-x 4 liqiu staff 136 10 18 09:56svn

@~ $ more /tmp/error

@~ $

原因在于:重定位運算符 ">" 的默認參數為標準輸出 stdout ,即 1 ; 所以 ">" 等價于 "1>"; 上面的代碼等價于:

#!/bin/bash

ls liqiu 1> /tmp/error

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

ls -l 1> /tmp/logecho $?

二、捕獲異常

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

#!/bin/bash

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

ls -l > /tmp/logecho $?

執行之后,發現錯誤信息出現在了文件/tmp/log中。

@~ $ cat /tmp/error

ls: liqiu: Nosuch file or directory

@~ $

總結

以上是生活随笔為你收集整理的bash 抓捕异常_SHELL异常处理(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。