Bash betiği çıkmadan önce bir komut nasıl çalıştırılır?


119

Bir Bash betiği varsa set -eve betikteki bir komut bir hata döndürürse, komut dosyası çıkmadan önce nasıl bir temizlik yapabilirim?

Örneğin:

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

/tmp/fooKomutlardan biri ... do stuff ...başarısız olsa bile bunun kaldırıldığından nasıl emin olabilirim ?

Yanıtlar:


193

Tuzak kullanımına bir örnek:

#!/bin/bash -e

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

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Çıktı:

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

Asdffdsa satırı başarısız olsa bile, temizliğin hala yürütüldüğüne dikkat edin.


11

Gönderen bashman (yerleşiklerini ilgili):

trap [-lp] [[arg] sigspec ...]
Komut arg, kabuk sinyal (ler) sigspec aldığında okunmalı ve çalıştırılmalıdır.

Dolayısıyla, Anon'un cevabında belirtildiği gibi, ERR'detrap istediğiniz işleyiciyi kurmak için komut dosyasının başlarında arayın .


Yerleşik help trapüzerinde biraz yardım görmek için çalıştırın .
Flimm

8

Referanstan set:

-e

Basit bir komut (bkz. Bölüm 3.2.1 Basit Komutlar) sıfırdan farklı bir durumda çıkarsa, başarısız olan komut bir until veya while döngüsünün parçası, if ifadesinin parçası, bir && veya || listesi veya komutun dönüş durumu! kullanılarak ters çevriliyorsa. Kabuk çıkmadan önce, ayarlanmışsa, ERR üzerinde bir tuzak çalıştırılır.

(Vurgu benim).


"-E" kullanırken "-E" eklemeye değer olabilir, bkz. Vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough

3

shdevguydavid'in cevabının versiyonu .

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

ref: shellscript.sh


POSIXbeni gulduruyor. :) Bağlantı verdiğiniz harika eğitim sitesi.
Cometsong
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.