LINUX.ORG.RU

Как создать временный файл в shell стандартными средствами?


0

0

Как создать временный файл в shell?
Я конечно могу создать свою программку типа

for (( i=0; i<100; i++ )); do
NAME="/tmp/$$.$i"
if [ ! -e $NAME ]; then
touch $NAME
break
fi
done

но лучше бы она уже была и стандартная, а если бы ещё и файлы за собой сама подчищала (созданные текущим процессом) совсем было бы хорошо, не знаю только возможно ли такое щасте :)


Ответ на: комментарий от pvv

Для зачистки можно использовать то свойство, что если удаляется
открытый файл то из каталога будет удалено имя, а файл будет
удален только после того когда процесс его закроет (если на файл
не было других жестких ссылок).

[cs@const ~]% TMPF=$(mktemp aa.XXXXXX)
[cs@const ~]% exec 3>$TMPF
[cs@const ~]% exec 4<$TMPF
[cs@const ~]% rm $TMPF
[cs@const ~]% ls -l $TMPF
ls: aa.is8uwA: No such file or directory
[cs@const ~]% echo Hello world>&3
[cs@const ~]% cat <&4
Hello world
[cs@const ~]% exec 3>&-
[cs@const ~]% exec 4<&-

kosmonavt
()
Ответ на: комментарий от kosmonavt

Только у некоторых файловых систем (не будем показывать пальцем) от таких приколов квоты сбиваются.

Teak ★★★★★
()
Ответ на: комментарий от kosmonavt

Ну, в обшем, забей, это у меня наболело :) Ты с таким не встретишься скорей всего.

Teak ★★★★★
()
Ответ на: комментарий от alexru

Ну вот фигли вы настырные такие :) Поверьте, этой файловой системой Вам пользоваться не придётся. И тот факт, что она некорректно работает с квотами удалённых открытых файлов, является откровенной багой, которую разработчикам просто лень фиксить (типа есть более важные дела). Так что прошу считать мой первый пост в этой теме недействительным :)

На самом деле удалять открытые файлы - это нормальный приём, по слухам perl -i (без расширения) именно так и работает (открывает файл на чтение, удаляет его и опять создаёт файл с таким же именем, в который и записывается результат обработки). Так что не слушайте мои параноидальные бредни :)

Teak ★★★★★
()

mktemp - не больно-то стандартный способ. В очень многих системах его
нет. Если используется несколько временных файлов, то лучше создавать
временный каталог, а в нём уже файлы.

Я делаю так:

if which mktemp >/dev/null 2>&1; then
    TEMP=`mktemp -d`
else
    TEMP=$TMPDIR
    test -z "$TEMP" && TEMP=/tmp    
    TEMP=$TEMP/$PROGRAM$$.tmp
    mkdir -m 0700 "$TEMP" || exit 1
fi
trap "rm -rf $TEMP" EXIT INT QUIT ABRT TERM

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.