
Нужно ли мне проверять и создавать /tmp
перед записью в файл внутри него? Предположим, что никто не запускал, sudo rm -rf /tmp
потому что это очень редкий случай
решение1
TheФХСмандаты, которые /tmp
существуют, как иPOSIXтак что вы можете рассчитывать на его наличие (по крайней мере, в совместимых системах; но на самом деле его присутствие в Unix-подобных системах практически гарантировано). Но вам не следует этого делать: системный администратор или пользователь могут предпочесть другие места для временных файлов. СмотритеПоиск правильного каталога tmp на нескольких платформахБольше подробностей.
решение2
На практике, /tmp
практически гарантированно существует. Однако, даже если он существует, это не значит, что вам следует помещать туда временные файлы.
TheстандартныйСоглашение заключается в использовании TMPDIR
переменной окружения. Если она существует, она указывает на каталог для временных файлов. Если ее нет, поместите временные файлы в /tmp
.
В скрипте оболочки вы можете использовать "${TMPDIR:-/tmp}"
как временное расположение файла: это расширяется до значения, TMPDIR
если оно установлено¹, и до /tmp
в противном случае. Или вы можете установить TMPDIR
условно, если оно не установлено, с помощью команды
: "${TMPDIR:=/tmp}"
а затем создать временные файлы внутри "$TMPDIR"
.
Обратите внимание, что любое приложение может создавать файлы в /tmp
или $TMPDIR
. Кроме того, этот каталог может быть общим для нескольких пользователей, поэтому вам нужно позаботиться о разрешениях при создании файла. Во многих системах (Linux, *BSD) есть командаmktemp
который безопасно создает файлы в правильном каталоге. Обычно это хорошая идея для mktemp
создания временных файлов и каталогов — особенно из скрипта оболочки, где невозможно безопасно создать файл в общем каталоге из-за возможности атак симлинков ( mkdir
это нормально, если вы правильно обрабатываете ошибки).
¹ и непустая — если переменная пуста, то ее в любом случае нельзя использовать как есть, и, как правило, рекомендуется обрабатывать пустые или неустановленные переменные таким же образом, если они должны содержать имя файла.
решение3
Хотя весьма вероятно, что он существует, вам следует проверить еще одну причину: нет гарантии, что он будетбольшой. Во многих системах /tmp
поддерживается оперативной памятью, а не диском, и, скорее всего, ограничена несколькими ГБ. (В системах Fedora по умолчанию это половина оперативной памяти.) Поэтому вам следует проверить не только наличие, но и наличие места для того, что вы собираетесь туда поместить.
Если у вас что-то большое, используйте /var/tmp/
.