arka plan fonksiyonlarında bash tuzağı


1

Arka planda bir komut dosyasında bir işlev çağırma - '&' kullanarak, işlev a subshell. İşlev bittiğinde, subshellçıkış durumuyla sona erer. subshellGünlük dosyalarını otomatik olarak iptal etmek için çıkış sinyalini yakalamak istiyorum . Test betiğim şöyle:

$ cat mscript.sh 
#!/usr/bin/env sh

mout="log.out"
rm -f $mout

# My testing log files
tmps=(first.tmp second.tmp third.tmp)

# Traps exit signal to delete the logfile upon exiting.
mtrap_tmp() {
  local ftmp="$1"
  # I create the tep file here:
  echo "init $ftmp" &>> $ftmp
  echo -e "\n($BASHPID) trapping \"$ftmp\"..." &>> $mout
  ## Here I trap the signal, to delete the temporary file.
  trap "rm -f \"$ftmp\"" EXIT
  echo -e "  trapped tmp file \"$ftmp\" to rm" &>> $mout
  echo "  $(ls -l $ftmp)" &>> $mout
}

# I trap the first and second log files within the script's pid. 
# Then I trap the third file in a subshell:
mtrap_tmp ${tmps[0]}
mtrap_tmp ${tmps[1]}
mtrap_tmp ${tmps[2]} &
wait $!

# Here I want to check the temp files do exist. 
# I expect the third file to be trapped in a subshell, 
# and hence to be non-existent once the subshell ends, 
# which should have happened after the `wait $!`:

for i in ${tmps[@]}; do
  echo -e "\nfinal check $i:" &>> $mout
  ls -l ${i} &>> $mout
done

echo "done"
exit 0 

Çıktı aşağıdaki gibidir:

$  cat log.out 

(10598) trapping "first.tmp"...
  trapped tmp file "first.tmp" to rm
  -rw-rw-r-- 1 anadin ctgb 15 Jul  4 15:54 first.tmp

(10598) trapping "second.tmp"...
  trapped tmp file "second.tmp" to rm
  -rw-rw-r-- 1 anadin ctgb 16 Jul  4  2017 second.tmp

(10602) trapping "third.tmp"...
  trapped tmp file "third.tmp" to rm
  -rw-rw-r-- 1 anadin ctgb 15 Jul  4  2017 third.tmp

final check first.tmp:
-rw-rw-r-- 1 anadin ctgb 15 Jul  4 15:54 first.tmp

final check second.tmp:
-rw-rw-r-- 1 anadin ctgb 16 Jul  4 15:54 second.tmp

final check third.tmp:
-rw-rw-r-- 1 anadin ctgb 15 Jul  4 15:54 third.tmp

Dosyanın third.tmpkomut dosyasının bitiminden önce silinmesini bekliyordum. Garip olan, sadece second.tmp dosyası iptal edildi:

$ ls *.tmp
first.tmp  third.tmp

Üçüncü dosyanın yalnızca işlev çıktıktan sonra kaldırılmasını bekliyorum. Komut dosyası tamamlandıktan sonra diğer iki dosyanın kaldırılmasını bekliyorum.

Burada yanlış olan ne?

Yanıtlar:


1

Üçüncü tuzak bir alt kabukta oluşturulduğundan , kabuk çıktıktan sonra üçüncü dosya oluşturulmadan önce kaldırılmaya çalışılarak da etkinleştirilir / çalıştırılır . Bu nedenle, üçüncü dosya komut dosyası yapıldıktan sonra var olur.

Eğer her zaman trap […] SIGNALsen üzerine bu sinyali tuzağı, bu yüzden sadece ikinci tuzak üst kabukta kurtulur. Bu nedenle, ilk dosya komut dosyası yapıldıktan sonra var olur.

Bir echotuzak ya da muhtemelen set -o xtraceneler daha iyi gösterecektir. trapHangi tuzakların etkin olduğunu görmek için kendi başınıza da koşabilirsiniz .

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.