Podczas uruchamiania skryptu chcę utworzyć plik tymczasowy w /tmp
katalogu.
Po wykonaniu tego skryptu zostanie on wyczyszczony przez ten skrypt.
Jak to zrobić w skrypcie powłoki?
shell-script
tmp
Bhuvanesh
źródło
źródło
/proc
- z wyjątkiem systemów, które go nie mają.exec 3> "$tmpfile"
zrobić? Czy to nie jest użyteczne tylko wtedy, gdy plik tmp jest samodzielnym skryptem?cat <&3
daBad file descriptor
. Byłbym wdzięczny, jeśli to naprawisz lub usuniesz; dezinformacja niewiele pomaga.Użyj,
mktemp
aby utworzyć tymczasowy plik lub katalog:Lub w kierunku direcotry:
Na końcu skryptu musisz usunąć plik tymczasowy / katalog:
mktemp tworzy plik w
/tmp
katalogu lub w drectory podanym z--tmpdir
argumentem.źródło
trap "rm -f $temp_file" 0 2 3 15
zaraz po utworzeniu pliku, aby po wyjściu lub zatrzymaniu skryptuctrl-C
plik był nadal usuwany.EXIT
jest to jedyny haktrap
?kill -9 $somepid
. Ten szczególny sygnał zabójstwa to natychmiastowa śmierć i nic innego się nie dzieje.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
Wystarczą pułapki .Jeśli korzystasz z systemu, który ma mktemp , powinieneś użyć go jako innych odpowiedzi.
Z zestawem narzędzi POSIX:
źródło
EXIT
jest to jedyny haktrap
?tmpfile
nadal będzie usuwany przed zakończeniem skryptu, ale nie, gdy skrypt otrzyma inne sygnały.That's not what happens
?mktemp
pochodzi z HP / UX z inną składnią. Todd C. Miller stworzył inny dla OpenBSD w połowie lat 90. (skopiowany przez FreeBSD i NetBSD), a później udostępnił go również jako samodzielne narzędzie (www.mktemp.org). Jest to ten, który był zwykle używany w Linuksie, dopókimktemp
w 2007 r. Nie dodano (głównie kompatybilnego) narzędzia do GNU coreutils. Nie można powiedzieć, że tak naprawdę nie można powiedzieć, żemktemp
to narzędzie GNU.Niektóre muszle mają wbudowaną funkcję.
zsh
zsh
jest=(...)
podstawienia proces wykorzystuje plik tymczasowy. Na przykład=(echo test)
rozwija się do ścieżki pliku tymczasowego, który zawieratest\n
.Plik ten jest automatycznie usuwany po zakończeniu wykonywania polecenia.
bash / zsh w systemie Linux.
Pliki-tutaj lub ciągi-tu są
bash
izsh
są implementowane jako usunięte pliki tymczasowe.Więc jeśli to zrobisz:
Deskryptor pliku 3 jest połączony z usuniętym plikiem tymczasowym, który zawiera
test\n
.Możesz uzyskać jego zawartość za pomocą:
W systemie Linux można również czytać lub zapisywać do tego pliku za pośrednictwem
/dev/fd/3
(niektóre inne powłoki używają potoków lub mogą użyć,
/dev/null
jeśli tutaj dokument jest pusty).POSIX
Nie ma
mktemp
narzędzia POSIX. POSIX określa jednakmkstemp(template)
interfejs API języka C , am4
standardowe narzędzie udostępnia interfejs API zmkstemp()
funkcją m4 o tej samej nazwie.mkstemp()
daje nazwę pliku z losową częścią, która nie istniała w momencie wywołania funkcji. Tworzy plik z uprawnieniami 0600 w sposób bez wyścigu.Więc możesz zrobić:
Zauważ jednak, że musisz wyjść z czyszczenia po wyjściu, ale jeśli musisz tylko napisać i odczytać plik określoną liczbę razy, możesz go otworzyć i usunąć zaraz po utworzeniu, jak w przypadku tutaj-doc / here- powyższe podejście łańcuchowe:
Możesz otworzyć plik do odczytu raz i przewinąć do tyłu między dwoma odczytami, jednak nie ma narzędzia POSIX, które może zrobić to przewijanie (
lseek()
), więc nie możesz tego zrobić przenośnie w skrypcie POSIX (zsh
(sysseek
wbudowany) iksh93
(<#((...))
operator) może zrób to jednak).źródło
<()
=(...)
.Oto nieco ulepszona odpowiedź w linii Hauke Laging:
źródło
Mój przepływ pracy zwykle z plikami tymczasowymi wynika z testowanego skryptu bash. Chcę
tee
to poprawić, aby zobaczyć, że działa, i zapisać dane wyjściowe do następnej iteracji mojego procesu. Utworzyłem plik o nazwietmp
żebym mógł go używać jak
Powodem, dla którego podoba mi się data i godzina sformatowana przed losowymi wartościami, jest to, że pozwala mi łatwo znaleźć plik tmp, który właśnie utworzyłem, i nie muszę myśleć o tym, jak nazwać go następnym razem (i skupić się na otrzymaniu skryptu Dang pracować).
źródło