Какая разница между tempfile и mktemp?
В большинстве систем, с которыми я столкнулся, есть как tempfile(1)
, так и mktemp(1)
. Существуют синтаксические различия, а mktemp
также может создавать каталоги, но они, похоже, делают то же самое.
Есть ли разница между этими двумя? Почему оба существуют? Является ли еще один стандарт, чем другой? Если я просто хочу создать временный файл безопасно, есть ли какая-то причина предпочесть друг другу?
Я подозреваю, что за этим стоит интересное знание Unix, но мои поиски ничего не показывают.
Ответы
Ответ 1
Я подозреваю, что за этим стоит интересное знание Unix...
история mktemp
можно проследить до OpenBSD 2.1. Однако он стал частью GNU coreutils намного позже. Это сообщение объявило о включении mktemp
для coreutils
.
До тех пор, tempfile
использовался несколькими программами. Было также предложение , чтобы tempfile
обернуть вокруг mktemp
, который был отклонен, чтобы препятствовать использование tempfile
.
Однако в tempfile
было добавлено следующее:
Эксклюзивное создание не гарантируется при создании файлов на разделах NFS. tempfile
не может создавать временные каталоги. tempfile
устарел; вы должны использовать mktemp(1)
.
Ответ 2
В руководстве tempfile говорится:
tempfile - create a temporary file in a safe manner
Пока в mktemp:
mktemp - create a temporary file or directory
Они, вероятно, почти одинаковы, только реализация немного отличается.
Как сказано в руководстве, tempfile
действительно имеет некоторые меры предосторожности, такие как:
a) Если существует переменная среды TMPDIR
и содержит имя соответствующего каталога, который используется.
b) В противном случае, если аргумент --directory
указан и Соответственно, он используется.
c) В противном случае P_tmpdir
(как определено в <stdio.h>
) используется, когда необходимо.
d) Наконец, можно использовать директорию, определенную реализацией (/tmp
).
Это действительно полезно, если script доверяет mktemp
или tempfile
достаточно уверен, что будет создан временный файл или каталог. Но я не вижу большой проблемы, просто используя mktemp
, если вы запустите меры предосторожности в своем script самостоятельно. Вы можете использовать [ -e ]
, [ -f ]
, [ -d ]
, [ -L ]
и т.д., Чтобы проверить, действительно ли файл был сделан/уже сделан. Даже проверьте, есть ли что-то доступное для записи, доступное для чтения и/или исполняемое с -r, -w и -x. В bash см. help test
.
Тем не менее, для непрерывной работы, возможно, лучше использовать tempfile
при запуске кода в нескольких средах. Просто убедитесь, что он доступен везде. С помощью which
или с помощью type -P
вы можете проверить, какая из них доступна. Пример:
create_temp() {
if type -P tempfile >/dev/null; then
# use tempfile based from $1
elif type -P mktemp > /dev/null; then
# use mktemp based from $1
else
echo "Can't find temporary file creator."
exit 1
fi
}
Ответ 3
В исходном коде вид вещей (на debian) tempfile
из пакета debianutils
и использует функцию libc tempnam()
, а mktemp
- из GNU coreutils и не использует функцию libc