É seguro remover um arquivo de script desse script?


9

Imagine que eu tenho um script foo. Ele deve ser executado uma vez quando o usuário efetuar login e não for necessário após uma execução bem-sucedida.

Minha pergunta: É seguro remover o arquivo de script de dentro do script?

Por exemplo:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0

2
Não totalmente não relacionado, você pode usar #!/bin/bash -epara garantir que o arquivo de script seja removido apenas se nada der errado.
sr_

3
Sim, é seguro. Se você quer saber, por isso, leia stackoverflow.com/questions/2028874/...
Jofel

2
@ jofel Parece bom, sugiro que você faça disso uma resposta. :-)
htorque

Em caso de dúvida, você pode substituir as duas últimas linhas por exec rm /path/to/foo.
kasperd

Respostas:


5

É seguro remover o arquivo do shell enquanto o executa, pois os manipuladores de arquivos não são afetados pela (re) movimentação do arquivo correspondente.

Para mais informações, clique aqui .


2
Esteja ciente de que ele pode não funcionar, dependendo do seu sistema (ou seja, a rm <it-self>não terá sucesso no HP-UX.
Ouki

11
@Ouki, por quê? Isso não violaria o POSIX?
21412 maxschlepzig

3
@maxschlepzig O POSIX permite que o último link para um executável que está sendo executado no momento falhe: unlinkpode falhar ETXTBUSY. (Estranhamente, "procedimento puro" e "texto compartilhado" não são definidos na especificação; AFAIK significam um componente de um programa executável: o próprio executável ou uma biblioteca que ele usa). Todos os principais departamentos, exceto o HP-UX, permitem que os executáveis ​​sejam renomeados e desvinculados.
Gilles 'SO- stop be evil'

2
@ Ouki Isso deve ser fácil de contornar, simplesmente encerrando o script exec rm /path/to/foo.
kasperd

0

Eu estava sempre nervoso com isso, então eu fiz:

(sleep 5; rm /path/to/shell/script) &
exit 0

Como alternativa, você pode encadear um script temporário:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme

11
Nas duas abordagens sugeridas, ainda haverá um processo de shell que não concluiu a execução do script no momento em que ele foi excluído.
kasperd

O que você quer fazer éexec rm /path/to/shell/script
osvein 18/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.