No Linux, você pode usar o sinalizador imutável usando chattr
para obter somente leitura em nível de sistema de arquivos (requer permissões apropriadas). Eu não uso o OS X e não sei se tem algo semelhante, mas você pode conseguir "depois que o script for executado, test.txt
ainda existe" usando:
#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT
rm -f test.txt
Esse script renomeia test.txt
para test.bak
e renomeia quando o script é encerrado (após rm -f test.txt
). Isso não é verdadeiramente somente leitura, mas a menos que você kill -KILL
do seu script, ele deve preservar seus dados pelo menos.
Idéia alternativa, se você insistir em ter essa linha, por que não sair mais cedo?
#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.
rm -f test.txt
Alternativa que transforma rm
em uma função que não faz nada:
#!/bin/sh
# do your thing
rm() {
# this function does absolutely nothing
: # ... but it has to contain something
}
rm -f test.txt
Semelhante ao método de função acima, mas usando o comando alias
reprovado para alias rm
para o true
interno que não faz nada (mas returing um verdadeiro código de saída):
#!/bin/sh
# do your thing
alias rm=true
rm -f test.txt
Alternativa que remove rm
do ambiente (supondo que não haja rm
embutido):
#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha
# gives error: bash: rm: No such file or directory
rm -f test.txt
Outro que altera $PATH
usando um programa stub rm
(usando /tmp
como caminho de pesquisa):
#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp
rm -f test.txt
Para mais informações sobre built-ins, execute help <built-in>
para detalhes. Por exemplo:
true: true
Return a successful result.
Exit Status:
Always succeeds.
Para outros comandos, use man rm
ou procure na página de manual, man bash
.