Подтвердить что ты не робот

Какая разница между tempfile и mktemp?

В большинстве систем, с которыми я столкнулся, есть как tempfile(1), так и mktemp(1). Существуют синтаксические различия, а mktemp также может создавать каталоги, но они, похоже, делают то же самое.

Есть ли разница между этими двумя? Почему оба существуют? Является ли еще один стандарт, чем другой? Если я просто хочу создать временный файл безопасно, есть ли какая-то причина предпочесть друг другу?

Я подозреваю, что за этим стоит интересное знание Unix, но мои поиски ничего не показывают.

4b9b3361

Ответ 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