Ao executar um script, quero criar um arquivo temporário no /tmp
diretório
Após a execução desse script, isso será limpo por esse script.
Como fazer isso no shell script?
shell-script
tmp
Bhuvanesh
fonte
fonte
/proc
- exceto para sistemas que não o possuem.exec 3> "$tmpfile"
faz? Isso não é útil apenas se o tmpfile for um script independente?cat <&3
vai darBad file descriptor
. Eu apreciaria se você consertar ou remover; desinformação não ajuda muito.Use
mktemp
para criar um arquivo ou diretório temporário:Ou para um direcotry:
No final do script, você deve excluir o arquivo / diretório temporário:
mktemp cria um arquivo no
/tmp
diretório ou no diretório fornecido com o--tmpdir
argumentofonte
trap "rm -f $temp_file" 0 2 3 15
logo após criar o arquivo para que, quando o script sair ou for interrompido,ctrl-C
o arquivo ainda seja removido.EXIT
for o único ganchotrap
?kill -9 $somepid
. Esse sinal de matança em particular é a morte instantânea e nada mais acontece.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
é suficiente.Se você estiver no sistema que possui mktemp , use-o como outras respostas.
Com o suporte de ferramenta POSIX:
fonte
EXIT
for o único ganchotrap
?tmpfile
ainda será removido antes da saída do script, mas não quando o script receber outros sinais.That's not what happens
?mktemp
originado no HP / UX com uma sintaxe diferente. Todd C. Miller criou um diferente para o OpenBSD em meados dos anos 90 (copiado pelo FreeBSD e NetBSD) e posteriormente o disponibilizou como um utilitário independente (www.mktemp.org). Esse é o que normalmente era usado no Linux até que ummktemp
utilitário (principalmente compatível) foi adicionado aos coreutils do GNU em 2007. Apenas para dizer que não se pode realmente dizer quemktemp
é um utilitário do GNU.Algumas conchas têm o recurso embutido.
zsh
zsh
A=(...)
forma de substituição do processo usa um arquivo temporário. Por exemplo,=(echo test)
expande para o caminho de um arquivo temporário que contémtest\n
.Esse arquivo é removido automaticamente quando o comando é concluído.
bash / zsh no Linux.
Here-files ou here-strings
bash
ezsh
são implementados como arquivos temporários excluídos.Então, se você fizer:
O descritor de arquivo 3 está conectado a um arquivo temporário excluído que contém
test\n
.Você pode obter seu conteúdo com:
Se no Linux, você também pode ler ou gravar nesse arquivo via
/dev/fd/3
(algumas outras conchas usam tubos ou podem ser usadas
/dev/null
se o documento aqui estiver vazio).POSIX
Não há
mktemp
utilitário POSIX. No entanto, o POSIX especifica umamkstemp(template)
API C e om4
utilitário padrão expõe essa API com amkstemp()
função m4 com o mesmo nome.mkstemp()
fornece um nome de arquivo com uma parte aleatória que foi garantida para não existir no momento em que a função foi chamada. Ele cria o arquivo com permissões 0600 de forma livre de corrida.Então, você poderia fazer:
Observe, no entanto, que você precisa lidar com a limpeza na saída, embora, se você apenas precise escrever e ler o arquivo um número fixo de vezes, poderá abri-lo e excluí-lo logo após criar o arquivo para aqui-doc / aqui- abordagem de string acima:
Você pode abrir o arquivo para leitura uma vez e retroceder entre duas leituras, no entanto, não existe um utilitário POSIX que possa fazer isso retroceder (
lseek()
); portanto, não é possível fazê-lo de forma portável em um script POSIX (zsh
(sysseek
incorporado) eksh93
(<#((...))
operador) pode faça isso).fonte
<()
=(...)
.Aqui está uma resposta um pouco melhorada na linha de Hauke Laging:
fonte
Meu fluxo de trabalho normalmente com arquivos temporários é devido a algum script bash que estou testando. Eu quero fazer
tee
isso para que eu possa ver que está funcionando e salvar a saída para a próxima iteração do meu processo. Eu criei um arquivo chamadotmp
para que eu possa usá-lo como
A razão pela qual eu gosto da data e hora formatada antes dos valores aleatórios é que me permite encontrar o arquivo tmp que acabei de criar com facilidade, e não preciso pensar em como nomeá-lo na próxima vez (e focar apenas em obter meu script dang trabalhar).
fonte