
Eu costumo ficar no StackOverflow mas acho que nesse assunto vocês são muito mais especialistas aqui.
Então o exercício de hoje é estranho, tenho que escrever um script.sh
e nele fazer o que posso para evitar test.txt
que seja deletado mas o problema é que a última linhatemser
rm -f test.txt
Eu realmente não sei muito sobre shell (geralmente faço c/objective-c), então peguei um livro, não terminei, mas ainda não tenho ideia de como fazer isso.
Pensei em permissões, mas o script receberá todas as permissões quando testado, então não é uma opção ... (não sei se isso importa, mas o script será executado no OS X).
Responder1
No Linux, você pode usar o sinalizador imutável chattr
para obter somente leitura no nível do sistema de arquivos (no entanto, requer permissões apropriadas). Não uso OS X e não sei se tem algo parecido, mas você poderia 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
Este script é renomeado test.txt
e test.bak
renomeado novamente quando o script é encerrado (depois de rm -f test.txt
). Isso não é realmente somente leitura, mas, a menos que você use kill -KILL
seu script, ele deve preservar pelo menos seus dados.
Idéia alternativa, se você insiste em incluir 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 se 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 alias
comando obsoleto para alias rm
ao true
integrado que não faz nada (mas retorna um código de saída verdadeiro):
#!/bin/sh
# do your thing
alias rm=true
rm -f test.txt
Alternativa que retira 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 muda $PATH
usando um rm
programa stub (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 obter mais informações sobre recursos integrados, execute help <built-in>
para obter detalhes. Por exemplo:
true: true
Return a successful result.
Exit Status:
Always succeeds.
Para outros comandos, use man rm
ou consulte a página de manual, man bash
.
Responder2
A remoção de um arquivo requer permissão de gravação no diretório que o contém.
$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied
Você provavelmente deveria fazer isso em um diretório temporário criado para esse propósito; você não deseja remover a permissão de gravação em seu diretório pessoal, por exemplo, embora seja fácil de recuperar comchmod +w .