Der Benutzer ruft mein Skript mit einem Dateipfad auf, der an einem bestimmten Punkt im Skript entweder erstellt oder überschrieben wird, z foo.sh file.txt
oder foo.sh dir/file.txt
.
Das Verhalten beim Erstellen oder Überschreiben entspricht weitgehend den Anforderungen, um die Datei auf der rechten Seite des Ordners zu platzieren >
Ausgabe-Umleitungsoperators zu setzen oder sie als Argument an zu übergeben tee
(tatsächlich tee
ist es genau das, was ich tue, wenn ich sie als Argument an übergebe) ).
Bevor ich in den Eingeweiden des Skripts zu bekommen, möchte ich eine angemessene Kontrolle machen , wenn die Datei kann erstellt werden / überschrieben, aber es nicht wirklich schaffen. Diese Prüfung muss nicht perfekt sein, und es ist mir klar, dass sich die Situation zwischen der Prüfung und dem Punkt, an dem die Datei tatsächlich geschrieben wird, ändern kann Lösung besten Aufwand finden , sodass ich frühzeitig aussteigen kann In dem Fall, dass der Dateipfad ungültig ist.
Beispiele für Gründe, aus denen die Datei nicht erstellt werden konnte:
- Die Datei enthält eine Verzeichniskomponente wie
dir/file.txt
aber das Verzeichnisdir
existiert nicht - Der Benutzer hat keine Schreibberechtigung für das angegebene Verzeichnis (oder die CWD, wenn kein Verzeichnis angegeben wurde)
Ja, ich stelle fest, dass das Überprüfen von Berechtigungen "im Voraus" nicht The UNIX Way ™ ist , sondern ich sollte den Vorgang einfach ausprobieren und später um Verzeihung bitten. In meinem speziellen Skript führt dies jedoch zu einer schlechten Benutzererfahrung, und ich kann die verantwortliche Komponente nicht ändern.
/foo/bar/file.txt
. Grundsätzlich übergebe ich den Pfad tee
gerne dahin, tee $OUT_FILE
wo OUT_FILE
auf der Kommandozeile übergeben wird. Das sollte "nur" mit absoluten und relativen Pfaden funktionieren, oder?
tee -- "$OUT_FILE"
zumindest brauchen . Was ist, wenn die Datei bereits existiert oder existiert, aber keine reguläre Datei ist (Verzeichnis, Symlink, FIFO)?
tee "${OUT_FILE}.tmp"
. Wenn die Datei bereits vorhanden ist, wird tee
überschrieben. Dies ist in diesem Fall das gewünschte Verhalten. Wenn es ein Verzeichnis ist, tee
wird es fehlschlagen (glaube ich). symlink Ich bin nicht 100% sicher?