Как я могу создать временный файл с определенным расширением в Bash? - PullRequest
16 голосов
/ 10 марта 2010

Я пишу сценарий оболочки, и мне нужно создать временный файл с определенным расширением.

Я пробовал

tempname=`basename $0`
TMPPS=`mktemp /tmp/${tempname}.XXXXXX.ps` || exit 1

и

tempname=`basename $0`
TMPPS=`mktemp -t ${tempname}` || exit 1

тоже не работает, так как первый создает имя файла с литералом "XXXXXX", а второй не дает опцию для расширения.

Мне нужно расширение, чтобы превью не отказывалось открывать файл.

Редактировать: Я закончил с комбинацией pid и mktemp в том, что я надеюсь, безопасно:

tempname=`basename $0`
TMPTMP=`mktemp -t ${tempname}` || exit 1
TMPPS="$TMPTMP.$$.ps" 
mv $TMPTMP $TMPPS || exit 1

Он уязвим для атаки типа «отказ в обслуживании», но я не думаю, что что-то более серьезное.

Ответы [ 4 ]

12 голосов
/ 16 апреля 2014

Последние версии предложения mktemp --suffix:

   --suffix=SUFF
          append SUFF to TEMPLATE.  SUFF must not contain slash.  This option is implied if TEMPLATE does not end in X.

$ mktemp /tmp/banana.XXXXXXXXXXXXXXXXXXXXXXX.mp3
/tmp/banana.gZHvMJfDHc2CTilINNuq2P0.mp3

Я считаю, что для этого требуется coreutils> = 8 или около того.

Если вы создаете временный файл (более старую версию mktemp) без суффикса и переименовываете его, чтобы добавить один, наименее вероятно, что вы можете сделать, это проверить, существует ли файл. Он не защищает вас от условий гонки, но защищает вас, если такой файл уже существует некоторое время.

4 голосов
/ 04 июля 2014

Как насчет этого:

echo $(mktemp $TMPDIR/$(uuidgen).txt)
1 голос
/ 13 июня 2017

MacOS Sierra 10.12 не имеет опции --suffix, поэтому я предлагаю обходное решение:

    tempname=`basename $0`
    TMPPS_PREFIX=$(mktemp "${TMPDIR:-/tmp/}${tempname}.XXXXXX")
    TMPPS=$(mktemp "${TMPPS_PREFIX}.ps")
    rm ${TMPPS_PREFIX}
    echo "Your temp file: ${TMPPS}"
0 голосов
/ 15 мая 2019

Вот более переносимое решение (POSIX-совместимое):

temp=$(mktemp -u).ps
: >"$temp"

Первая строка запускает mktemp без создания файла, затем устанавливает temp в сгенерированное имя файла с добавлением .ps.Вторая строка затем создает его;touch "$temp" можно использовать вместо этого, если вы предпочитаете его.

РЕДАКТИРОВАТЬ: обратите внимание, что это не имеет те же разрешения, как он создает его с помощью перенаправления оболочки.Если вам нужно, чтобы другие пользователи не могли его прочитать, вы можете использовать chmod, чтобы установить его вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...