Czy można uwięzić wyjście / powrót funkcji? Dla programu, który mógłbym zrobić
trap -- "clean_this" EXIT
Spowoduje to wykonanie funkcji clean_this
po wyjściu z programu. Chciałbym zrobić coś takiego podczas wychodzenia z funkcji.
function myfunc() {
echo "I'm a function"
}
myfunc &
wait $!
Wykonuję tę funkcję w podpowłoce i chciałbym uwięzić jej wyjście / powrót. Czy to jest możliwe?
EDYCJA 1
Oto mój cel
Mam jeden skrypt do zarządzania plikami tymczasowymi:
cat tempfiles.sh
## List of temp files
tmp_tmp_files=()
## Adds a file to the list of temp files
function tmp_add_file() {
tmp_tmp_files+=("$1")
}
## Resets the list of temp files
function tmp_reset_files() {
tmp_tmp_files=()
}
## Removes the list of temp files
function tmp_rm_all() {
rm -f "${tmp_tmp_files[@]}"
}
## Removes all temp files on exit and sigint
trap "tmp_rm_all" EXIT SIGINT
Oto mój główny skrypt:
cat mscript.sh
source tempfiles.sh
## ## Creates a temp file and writes in it
mfunc() {
local tempfile=$(mktemp)
tmp_add_file $tempfile
echo "something" >> $tempfile
echo "($BASHPID) - tempfiles: ${tmp_tmp_files[@]}"
}
## Creates a temp file in main shell
mfunc
## Creates a temp file in a subshell
(mfunc)
Nazywam skrypt główny:
$ bash mscript.sh
(92250) - tempfiles: /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.oRlUxEBj
(92254) - tempfiles: /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.oRlUxEBj /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.s1iIvtpq
Sprawdzam pliki tymczasowe:
$ cat /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.oRlUxEBj
cat: /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.oRlUxEBj: No such file or directory
$ cat /var/folders/9k/h6hn75090_n8z0kythwmwqp96_0t2m/T/tmp.s1iIvtpq
something
Pliki tymczasowe zadeklarowane w subshell
są tracone z listy podczas wychodzenia z programu. Chciałbym, aby zostały idealnie usunięte na końcu funkcji. Albo muszę je specjalnie usunąć przed opuszczeniem funkcji, jest to łatwe i kosztuje mnie jeszcze jedną linię:
mfunc() {
local tempfile=$(mktemp)
tmp_add_file $tempfile1
echo "something" >> $tempfile
echo "tempfiles: ${tmp_tmp_files[@]}"
## Process things...
rm $tempfile1
}
Ale chciałbym wiedzieć, czy istnieje elegancki sposób na ich subshells
automatyczne usunięcie (pliki tymczasowe utworzone w ), tak jak robię to trap
przy wychodzeniu z programu.
Moje pytanie brzmi: czy można to zrobić? Jakie mogą być jakieś alternatywy?
myfunc
wywoływaćclean_this
na samym końcu. Lub przywołaj ich jak{ myfunc ; clean_this ; } &
. Czy naprawdę potrzebujesz pułapki?Odpowiedzi:
Podkładki dziedziczą środowisko lub jego część. Wygląda na to, że kiedy wykonujesz funkcję w podpowłoce, nie musisz eksportować swoich zmiennych (porównaj: Nie ma potrzeby eksportowania podczas uruchamiania funkcji w podpowłoce ). Mogą zaistnieć przypadki, w których musisz,
export
ale skupmy się na swoim przykładzie.Twoje podejście jest wadliwe i będzie trudne do utrzymania, ponieważ dziedziczenie idzie w jedną stronę. Każdy
(mfunc)
dziedziczytmp_tmp_files
i działa z własną kopią tablicy. Nie ma mowy, żeby mógł zmodyfikować oryginałtmp_tmp_files
użyty w głównym skrypcie. Dlatego główny skrypt nie może wyczyścić wszystkiego, po prostu nie ma wystarczającej ilości informacji.Jeśli wybierzesz czyszczenie z funkcji podpowłokowej, musisz zwrócić uwagę i odróżnić pliki tymczasowe funkcji od plików tymczasowych skryptu głównego. Przedwczesne usunięcie tego ostatniego może spowodować awarię skryptu.
Alternatywne podejście: katalog tymczasowy
Zamiast tworzyć tablicę, utwórz katalog i zapamiętaj jego ścieżkę. Zrób to raz na początku, a
export
jeśli potrzebujesz:Utwórz każdy plik tymczasowy w katalogu tymczasowym, tak jak to:
Na koniec usuń cały katalog, bez względu na to, czy określone pliki zostały utworzone przez główny skrypt, podpowłokę, a nawet jakiś zbłąkany program innej firmy. Do wykonania tego kroku możesz użyć pułapki. Po prostu:
źródło