Respostas:
Use mktemp -d
. Ele cria um diretório temporário com um nome aleatório e garante que o arquivo ainda não exista. Você precisa se lembrar de excluir o diretório depois de usá-lo.
Para uma solução mais robusta, uso algo como o seguinte. Dessa forma, o diretório temporário sempre será excluído após a saída do script.
A função de limpeza é executada no EXIT
sinal. Isso garante que a função de limpeza seja sempre chamada, mesmo que o script seja interrompido em algum lugar.
#!/bin/bash
# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`
# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
echo "Could not create temp dir"
exit 1
fi
# deletes the temp directory
function cleanup {
rm -rf "$WORK_DIR"
echo "Deleted temp working directory $WORK_DIR"
}
# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
# implementation of script starts here
...
Diretório do script bash a partir daqui .
Armadilhas Bash .
cleanup
irá rm -rf no seu diretório atual!
mktemp
falhar, WORK_DIR
estará vazio, o que significa que o comando ficaria rm -rf
sem argumento. Não uso FreeBSD, mas eu ficaria muito surpreso se rm -rf
foi equivalente arm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
e depois 2 rmdir /tmp/git/"${TMPWORKDIR}"
.. Se a variável estiver vazia agora, você ainda retornará /tmp/git/
para o sistema inteiro. Considere algo assim na resposta e eu concordarei com prazer. ;)
Minha frase favorita para isso é
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Considere a possibilidade de a criação temporária de diretórios falhar por qualquer motivo (talvez o sistema de arquivos / tmp esteja cheio ou tenha sido remontado somente para leitura devido a um erro?); em seguida cd $(mktemp -d)
, avaliará cd
quais alterações no diretório inicial do usuário serão excluídas posteriormente.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
O seguinte snippet criará com segurança um diretório temporário ( -d
) e armazenará seu nome no diretório TMPDIR
. (Um exemplo de uso de TMPDIR
variável é mostrado posteriormente no código em que é usado para armazenar arquivos originais que possivelmente serão modificados.)
A primeira trap
linha executa o exit 1
comando quando qualquer um dos sinais especificados é recebido. A segunda trap
linha remove (limpa) a $TMPDIR
saída do programa (normal e anormal). Inicializamos esses traps depois de verificarmos se mkdir -d
foi possível executar acidentalmente o trap de saída com $TMPDIR
um estado desconhecido.
#!/bin/bash
# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)
# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure it gets removed even if the script exits abnormally.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT
# Example use of TMPDIR:
for f in *.csv; do
cp "$f" "$TMPDIR"
# remove duplicate lines but keep order
perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
-d
verifica se há diretórios. 2.) A terminação já é o padrão para esses sinais.
mktemp -d -t <prefix>