如何在shell中處理異常(Part 2)

2021-07-23 05:20:43 字數 1575 閱讀 6415

在前面一片文章裡《如何在shell中處理異常(part1)》,簡單得介紹了幾種如何在shell中處理異常的方法,本文繼續介紹幾種用法,其實說是幾種,就一種。。就是合理使用trap。本文主要還是講如何用在shell中用trap去處理各種事情,當然不僅僅是指異常。不過,我們首先應該講得是異常。

之前在《shell中的trap和expr》裡簡單得介紹過了trap,所以這次我們就直接上**,上處理異常的**,這樣更加清晰明了,簡單直接。

先再重複下trap的使用方法吧:

trap

[command]

[signal]

代表trap會捕獲訊號[signal]後執行[command]

下面看段例項:

#!/bin/bash

trap "echo fail unexpectedly on line $filename:$lineno!" err mkdir ***x rm ***

這段**可以簡單得說明了trap在處理異常的應用,後面那個err,就是捕獲所有非0返回的shell執行,如果非0,那就是異常,就會被trap直接捕獲,而不會繼續往下執行了。在本文中的shell還會列印出檔名和行號等資訊,當然,這些你可以自由發揮了。當然,trap其實不僅僅可以做這一件事情,還有好多事情,他可以捕獲各種訊號,當然除了sigkill,所以,你可以使用trap做一些其他事情。

什麼是工作環境的清理呢,其實就是一般我們日常shell中可能會有各種臨時檔案,那留下這些檔案總是不好的,所以你可以借用trap進行清理。我們看下下面這個shell程式

#!/bin/bash

temp_file=/tmp/printfile.txt

pr $1 > $temp_file

echo -n "print file? [y/n]: "

read

if [ "$reply" = "y" ]; then

less $temp_file

firm $temp_file

這段**的作用其實就是把使用者一開始輸入的存到乙個臨時檔案裡,然後詢問下使用者是否檢視,如果檢視就給print出來。當當然,使用者看得話,沒什麼問題。看完了後,程式也就完了,臨時檔案也就刪了。但關鍵是,如果程式在執行中異常終止了呢,或者使用者直接按ctrl+c給終止了,這樣,就會有乙個臨時檔案留下。這個時候,你就可以去運用trap給你做些處理了。

#!/bin/bash

temp_file=/tmp/printfile.txt

trap "rm $temp_file; exit" sighup sigint sigterm

pr $1 > $temp_file

echo -n "print file? [y/n]: "

read

if [ "$reply" = "y" ]; then

lpr $temp_file

firm $temp_file

看上面這個程式,即使使用者按下了ctrl+c ,trap也會可以捕獲到,這樣無論如何,臨時檔案都會被清理掉。

好了,就說這麼多了,沒啥技術含量,就是玩玩。

參考資料

SHELL異常處理

寫shell好久了,經常被異常困擾,可竟然堅持了若干年沒用過,回想以前服務過的公司,阿彌陀佛,罪過罪過。廢話少說,希望此篇文章可以協助大家和我徹底結束shell指令碼就是linux命令集合的初級階段。如果要獲取shell指令碼的異常輸出,就需要首先理解shell命令的標準輸出stdout 標準錯誤s...

如何在多雲環境中處理資料

您正在建立有關該年度銷售額的快速報告,它需要使用三個單獨的資料庫。一種是在amazon web services上執行的物件資料庫。第二個和第三個是在microsoft azure上執行的關聯式資料庫。在這種多雲場景中,您需要解決一些問題 infoworld解釋 什麼是多雲?雲計算的下一步 入門 要...

如何在Shell指令碼中嵌入Python指令碼

原shell指令碼test.sh bin bash function main main test.sh t1 t2 t3執行結果 username computer test.sh t1 t2 t3 t1 t2 t3嵌入單行的python,比如切割個字串啥的 bin bash function m...