Kabuk komut dosyalarında bindirme işleme ve örtülü alt kabuklar


12

Diyelim ki bir EXITtuzak yoluyla bir çeşit temizleme kodu çalıştıran bir kabuk betiğiniz var , şöyle:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

trap mytrap exit

echo I am at the end of the script.

Bu, beklendiği gibi It's a trap!, komut dosyası çıktığında yazdırılır :

$ sh myscript
I am at the end of the script.
It's a trap!

Komut dosyasını, sonuçta başka bir komuta pipetlenen bazı çıktılar üreten bir işlev eklemek için değiştirin, örneğin:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

myfunc () {
  echo "I've got a bad feeling about this..."
}

trap mytrap exit

myfunc | cat > /dev/null

echo I am at the end of the script.

Boru nedeniyle, kod myfuncbir alt kabukta çalıştırılır ... ve alt kabuklar trapebeveynin davranışını miras almaz gibi görünür , yani burada kazandıran tuzak kodunuz tarafından temizlenmesi gereken herhangi bir işlem yaparsanız Olmaz.

Yani şunu deneyin:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
}

Ve mytrapalt kabuk çıktığında hala tetiklenemiyor . Açık bir şekilde ihtiyacınız olduğu ortaya çıktı, exitşöyle:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
  exit
}

Yukarıdaki kodla, mytrapalt kabuktan çıkıldığında uygun şekilde tetiklenir:

$ sh myscript 
It's a trap!
I am at the end of the script.
It's a trap!

Bu beklenen davranış mı? Burada birkaç şey beni şaşırttı:

  • trap ayarlar alt kabuklar tarafından devralınmadı
  • bir alt kabuktan örtülü çıkış bir EXIT tuzağı tetikliyor gibi görünmüyor

Yanıtlar:


8

Bash trapyerleşiği anahtar kelimeye izin verir RETURN. Dolayısıyla değişiklik:

trap mytrap EXIT

için:

trap mytrap RETURN

Tartışma bakınız trapde kabuk-builtins

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.