
Normalmente me quedo en StackOverflow, pero creo que en este tema ustedes son mucho más expertos aquí.
Así que el ejercicio de hoy es raro, tengo que escribir un script.sh
y en él hacer todo lo posible para evitar test.txt
que lo eliminen, pero el problema es que la última líneatieneser
rm -f test.txt
Realmente no sé mucho sobre Shell (normalmente hago c/objective-c), así que cogí un libro, no lo he terminado pero todavía no tengo idea de cómo hacerlo.
Pensé en los permisos, pero el script recibirá todos los permisos cuando se pruebe, por lo que no es una opción... (No sé si importa, pero el script se ejecutará en OS X).
Respuesta1
En Linux, puede usar el indicador inmutable chattr
para lograr solo lectura en un nivel de sistema de archivos (aunque requiere los permisos adecuados). No uso OS X y no sé si tiene algo similar, pero puedes lograr "después de ejecutar el script, test.txt
todavía existe" usando:
#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT
rm -f test.txt
Este script cambia el nombre test.txt
y test.bak
lo renombra nuevamente cuando el script sale (después de rm -f test.txt
). Esto no es realmente de solo lectura, pero a menos que utilice kill -KILL
su secuencia de comandos, al menos debería conservar sus datos.
Idea alternativa, si insistes en tener esa línea, ¿por qué no salir antes?
#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.
rm -f test.txt
Alternativa que se convierte rm
en una función que no hace nada:
#!/bin/sh
# do your thing
rm() {
# this function does absolutely nothing
: # ... but it has to contain something
}
rm -f test.txt
Similar al método de función anterior, pero usando el alias
comando obsoleto para crear un alias rm
al true
integrado que no hace nada (pero devuelve un código de salida verdadero):
#!/bin/sh
# do your thing
alias rm=true
rm -f test.txt
Alternativa que elimina rm
del entorno (asumiendo que no hay rm
incorporado):
#!/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
Otro que cambia $PATH
usando un rm
programa stub (usando /tmp
como ruta de búsqueda):
#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp
rm -f test.txt
Para obtener más información sobre las funciones integradas, ejecute help <built-in>
para obtener más detalles. Por ejemplo:
true: true
Return a successful result.
Exit Status:
Always succeeds.
Para otros comandos, use man rm
o busque en la página del manual, man bash
.
Respuesta2
Eliminar un archivo requiere permiso de escritura en el directorio que lo contiene.
$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied
Probablemente deberías hacer esto en un directorio temporal creado para este propósito; no desea eliminar el permiso de escritura en su directorio personal, por ejemplo, aunque es bastante fácil de recuperar conchmod +w .