Skip to content

Arquivos Temporarios

Aurelio Jargas edited this page Jul 23, 2013 · 6 revisions

Use a variável especial $ZZTMP se precisar criar arquivos temporários durante a execução de sua função.

Geralmente, o valor de $ZZTMP é /tmp/zz. Atenção, isso não é uma pasta, mas sim um prefixo. Você precisa completar este nome dentro de sua função.

Como usar a $ZZTMP

Ao criar um arquivo temporário, a função deve sempre usar seu próprio nome neste arquivo, para evitar colisões com outras funções. O prefixo padrão é $ZZTMP, depois um ponto ".", depois o nome da função sem o "zz".

Por exemplo, se minha função imaginária zzmadruga precisar de um arquivo temporário, farei no início:

local tmp="$ZZTMP.madruga.$$"

O nome real do arquivo temporário, será algo como /tmp/zz.madruga.1234, sendo 1234 o número do PID do processo ($$). É importante colocar o PID no nome do arquivo para evitar colisão caso a função seja disparada duas vezes ao mesmo tempo, na mesma máquina.

Mas você nem precisa se preocupar com isso, pois deste ponto em diante, você pode referenciar o arquivo temporário simplesmente como $tmp:

# Guarda resultado no arquivo temporário
sed … | grep … | cut … > "$tmp"
# Apaga o arquivo temporário
rm "$tmp"

Se precisar de mais de um arquivo temporário, basta criar um nome único para cada um:

local tmp1="$ZZTMP.madruga.$$.1"
local tmp2="$ZZTMP.madruga.$$.2"
local tmp3="$ZZTMP.madruga.$$.3"

E lembre-se de no final sempre apagá-los: rm "$tmp1" "$tmp2" "$tmp3"

Exemplos de uso da $ZZTMP

$ grep ZZTMP zz/* | grep tmp
zz/zzdiffpalavra.sh:   local tmp1="$ZZTMP.diffpalavra.$$.1"
zz/zzdiffpalavra.sh:   local tmp2="$ZZTMP.diffpalavra.$$.2"
zz/zzdos2unix.sh:      local tmp="$ZZTMP.dos2unix.$$"
zz/zzfeed.sh:          local tmp="$ZZTMP.feed.$$"
zz/zzlembrete.sh:      local tmp="$ZZTMP.lembrete.$$"
zz/zztrocaarquivos.sh: local tmp="$ZZTMP.trocaarquivos.$$"
zz/zztrocapalavra.sh:  local tmp="$ZZTMP.trocapalavra.$$"
zz/zzunix2dos.sh:      local tmp="$ZZTMP.unix2dos.$$"

Links:

Sempre use aspas

Sempre use aspas ao redor da variável que guarda o arquivo temporário ($tmp no exemplo), pois é possível que haja espaços em branco em seu caminho completo. Veja o porquê no tópico seguinte.

Nem sempre no /tmp

Veja como é definida a $ZZTMP, dentro do arquivo principal funcoeszz:

ZZTMPDIR_DFT="${TMPDIR:-/tmp}"
ZZTMP="${ZZTMPDIR:-$ZZTMPDIR_DFT}"
ZZTMP="${ZZTMP%/}/zz"

Ou seja, esta é a ordem para definir a pasta temporária:

  • Pegue o valor de $ZZTMPDIR, que pode ser definida livremente pelo usuário.
  • Se não tiver, use o valor de $TMPDIR, uma variável de ambiente em sistemas Unix.
  • Se não tiver, use /tmp.

Então não confie que o arquivo temporário estará sempre no /tmp. Pode ser qualquer pasta. Por isso defina a variável local $tmp e sempre use-a entre aspas.

Só para ilustrar, olhe o conteúdo bizarro da minha $TMPDIR aqui no Mac:

$ echo $TMPDIR
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/

$ echo $ZZTMP
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz

$ ls -1 $ZZTMP.*
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.ajuda
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.cidade
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.horacerta
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.jquery
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.natal
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.off
/var/folders/d9/d26bsz2j3vl7078wc20lxw_r0000gn/T/zz.on

Os arquivos sem o PID no final são arquivos de cache, que guardam dados da internet para não precisar buscá-los toda hora.