
Normalerweise bleibe ich bei StackOverflow, aber ich denke, dass Sie hier zu diesem Thema viel mehr Experten sind.
Die heutige Übung ist also komisch, ich muss eine schreiben script.sh
und darin alles tun, was ich kann, um zu verhindern, test.txt
dass sie gelöscht wird, aber der Haken ist, dass die letzte Zeilehatzu sein
rm -f test.txt
Ich weiß nicht wirklich viel über Shell (normalerweise mache ich C/Objective-C), also habe ich mir ein Buch besorgt, habe es noch nicht fertig gelesen, weiß aber immer noch nicht, wie das geht.
Ich habe über Berechtigungen nachgedacht, aber dem Skript werden beim Testen alle Berechtigungen erteilt, daher ist dies keine Option … (Ich weiß nicht, ob es wichtig ist, aber das Skript wird unter OS X ausgeführt).
Antwort1
Unter Linux können Sie das Flag immutable verwenden, chattr
um schreibgeschützten Zugriff auf Dateisystemebene zu erreichen (erfordert jedoch entsprechende Berechtigungen). Ich verwende OS X nicht und weiß nicht, ob es dort etwas Ähnliches gibt, aber Sie können „nach Ausführung des Skripts test.txt
noch vorhanden“ erreichen, indem Sie Folgendes verwenden:
#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT
rm -f test.txt
Dieses Skript benennt es test.txt
in um test.bak
und benennt es wieder zurück, wenn das Skript beendet wurde (nach rm -f test.txt
). Dies ist nicht wirklich schreibgeschützt, aber kill -KILL
es sollte zumindest Ihre Daten bewahren, es sei denn, Sie verwenden Ihr Skript.
Alternative Idee: Wenn Sie darauf bestehen, dass diese Zeile drin ist, warum beenden Sie das Programm nicht früher?
#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.
rm -f test.txt
Alternative, die sich rm
in eine Funktion verwandelt, die nichts tut:
#!/bin/sh
# do your thing
rm() {
# this function does absolutely nothing
: # ... but it has to contain something
}
rm -f test.txt
Ähnlich der Funktionsmethode oben, jedoch unter Verwendung des veralteten alias
Befehls als Alias rm
für die true
integrierte Funktion, die nichts tut (außer einen echten Exit-Code zurückgibt):
#!/bin/sh
# do your thing
alias rm=true
rm -f test.txt
Alternative, die rm
aus der Umgebung entfernt (unter der Annahme, dass keine rm
integrierte Funktion vorhanden ist):
#!/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
Ein weiteres Beispiel, das sich $PATH
durch die Verwendung eines Stub- rm
Programms (das /tmp
als Suchpfad verwendet wird) ändert:
#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp
rm -f test.txt
Weitere Informationen zu integrierten Funktionen erhalten Sie, indem Sie „ help <built-in>
for details“ ausführen. Beispiel:
true: true
Return a successful result.
Exit Status:
Always succeeds.
Verwenden Sie für andere Befehle man rm
die Manualpage oder schauen Sie dort nach man bash
.
Antwort2
Zum Entfernen einer Datei ist Schreibberechtigung für das Verzeichnis erforderlich, das sie enthält.
$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied
Sie sollten dies wahrscheinlich in einem temporären Verzeichnis tun, das zu diesem Zweck erstellt wurde. Sie möchten beispielsweise nicht die Schreibberechtigung für Ihr Home-Verzeichnis entfernen, obwohl es einfach genug ist, es wiederherzustellen mitchmod +w .