Arka planda bir komut dosyasında bir işlev çağırma - '&' kullanarak, işlev a subshell
. İşlev bittiğinde, subshell
çıkış durumuyla sona erer. subshell
Gü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.tmp
komut 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?