Во время выполнения скрипта я хочу создать временный файл в /tmp
каталоге.
После выполнения этого скрипта он будет очищен этим скриптом.
Как это сделать в сценарии оболочки?
shell-script
tmp
Bhuvanesh
источник
источник
/proc
- за исключением систем, у которых его нет.exec 3> "$tmpfile"
? Разве это не полезно, если tmpfile - это отдельный скрипт?cat <&3
дастBad file descriptor
. Буду признателен, если вы исправите или удалите это; дезинформация не очень помогает.Используйте
mktemp
для создания временного файла или каталога:Или для направления:
В конце скрипта вы должны удалить временный файл / dir:
mktemp создает файл в
/tmp
каталоге или в каталоге, указанном с--tmpdir
аргументом.источник
trap "rm -f $temp_file" 0 2 3 15
сразу после создания файла, чтобы при выходе из скрипта или его остановкеctrl-C
файл все равно удалялся.EXIT
это единственный крюк дляtrap
?kill -9 $somepid
. Этот конкретный сигнал убийства - insta-death, и больше ничего не происходит.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
достаточно.Если вы используете систему, в которой есть mktemp , вы должны использовать ее в качестве других ответов.
С помощью POSIX toolchest:
источник
EXIT
это единственный крюк дляtrap
?tmpfile
прежнему удаляется до выхода из скрипта, но не тогда, когда скрипт получает другие сигналы.That's not what happens
?mktemp
возникла в HP / UX с другим синтаксисом. Тодд С. Миллер создал в середине 90-х другой вариант для OpenBSD (скопированный FreeBSD и NetBSD), а затем сделал его также доступным в качестве отдельной утилиты (www.mktemp.org). Это тот тип, который обычно использовался в Linux, покаmktemp
в 2007 году в GNU coreutils не была добавлена (в основном совместимая) утилита. Просто сказать, что нельзя сказать,mktemp
что это утилита GNU.Некоторые оболочки имеют встроенную функцию.
ЗШ
zsh
«s=(...)
форма замещения процесса использует временный файл. Например,=(echo test)
раскрывается путь к временному файлу, который содержитtest\n
.Этот файл автоматически удаляется после завершения команды.
bash / zsh в Linux
Здесь-файлы или здесь-строки в
bash
иzsh
реализуются как удаленные временные файлы.Так что если вы делаете:
Файловый дескриптор 3 связан с удаленным временным файлом, который содержит
test\n
.Вы можете получить его содержание с:
Если в Linux вы также можете читать или записывать в этот файл через
/dev/fd/3
(некоторые другие оболочки используют трубы, или могут использовать,
/dev/null
если документ здесь пуст).POSIX
mktemp
Утилиты POSIX нет . Однако в POSIX указанmkstemp(template)
API C , аm4
стандартная утилита предоставляет этот API сmkstemp()
функцией m4 с тем же именем.mkstemp()
дает вам имя файла со случайной частью, которая гарантированно не существовала во время вызова функции. Он создает файл с разрешениями 0600 без участия гонок.Итак, вы можете сделать:
Тем не менее, обратите внимание, что вам нужно выполнить очистку при выходе, хотя, если вам нужно только записать и прочитать файл фиксированное количество раз, вы можете открыть и удалить его сразу после создания, как для here-doc / here- Струнный подход выше:
Вы можете открыть файл для чтения один раз и перемотать его между двумя операциями чтения, однако нет никакой утилиты POSIX, которая могла бы выполнить эту перемотку (
lseek()
), поэтому вы не можете сделать это переносимо в сценариях POSIX (zsh
(sysseek
встроенный) иksh93
(<#((...))
оператор) могут сделай это хотя).источник
<()
=(...)
.Вот несколько улучшенный ответ в строке Hauke Laging:
источник
Мой рабочий процесс обычно с временными файлами из-за некоторого сценария bash, который я тестирую. Я хочу, чтобы
tee
это было так, чтобы я мог видеть, что он работает, и сохранить результаты для следующей итерации моего процесса. Я создал файл с именемtmp
так что я могу использовать его как
Причина, по которой мне нравится дата-время, отформатированное перед случайными значениями, заключается в том, что он позволяет мне легко найти файл tmp, который я только что создал, и мне не нужно думать о том, как назвать его в следующий раз (и сосредоточиться только на получении своего чертового скрипта работать).
источник