簡體   English   中英

如何在 Bash 腳本退出之前運行命令?

[英]How to run a command before a Bash script exits?

如果 Bash 腳本set -e ,並且腳本中的命令返回錯誤,我如何在腳本退出之前進行一些清理?

例如:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

我如何確保/tmp/foo被刪除,即使... do stuff ...中的命令之一失敗?

以下是使用陷阱的示例:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

輸出:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

請注意,即使asdffdsa行失敗,仍會執行清理。

bash頁(關於內置):

陷阱[-lp] [[arg] sigspec ...]
當shell接收sigspec信號時,將讀取並執行命令arg。

因此,正如Anon。的回答所示 ,在腳本的早期調用trap來設置ERR所需的處理程序。

set的參考:

-e

如果一個簡單的命令(參見3.2.1簡單命令)以非零狀態退出,則立即退出,除非失敗的命令是until或while循環的一部分,if語句的一部分,&&或||的一部分。 列表,或者如果使用!反轉命令的返回狀態。 ERR上的陷阱(如果已設置)將在shell退出之前執行。

(強調我的)。

sh版本的devguydavid的答案

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

ref: shellscript.sh

我不知道這對你來說是之前還是之后。

您可以將腳本設置為在使用“陷阱”關閉后立即運行。 然后你可以關閉終端。

例如;

    trap  ./val.sh EXIT  #set command you want to run after close terminal 
    kill -9 $PPID        #kill current terminal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM