Das GNU Coreutils Handbuch fürmv
sagt:
-f --force Do not prompt the user before removing a destination file.
Dies scheint jedoch bereits das Standardverhalten für zu sein mv
, sodass die -f
Option überflüssig erscheint. ZB in GNU Bash Version 4.3.11:
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Es ist unwahrscheinlich, dass die Absicht des -f
Flags besteht, einen Alias zu überschreiben alias mv="mv -i"
, da es mehrere Standardmethoden zum Überschreiben eines Alias gibt (z. B. Verwenden \mv
), die dies präziser und auf eine Weise ausführen, die über Befehle hinweg konsistent ist.
Das Handbuch stellt fest, dass: "Wenn Sie mehr als eine der Optionen -i, -f, -n angeben, wird nur die letzte wirksam." Es ist jedoch unwahrscheinlich, dass die Absicht des -f
Flags ist, das -i
Flag im Allgemeinen zu überschreiben . weil ein gleichwertiges Verhalten durch einfaches Verwenden erreicht werden kann mv
, was viel prägnanter und verständlicher ist als das Verwenden mv -if
.
Was ist in diesem Fall der Zweck der -f
Flagge? Warum existiert es?
mount
(obwohl es bessere Beispiele gibt). Möchten Sie wirklich wissen, welche Standardeinstellungen für jede Option gelten, damit Sie bestimmen können, welche Optionen Sie festlegen müssen? Es ist eine GUTE SACHE, Optionen sowohl für die Standardeinstellung als auch für die Nicht-Standardeinstellung zu haben, sodass Sie die Option explizit festlegen können, anstatt im Kopf den Überblick über die Standardeinstellung zu behalten. Etwas, an das man sich leichter erinnern kann, als etwas, das es nicht gibt .Antworten:
Die Verwendung von
-f
ist in der Manpage von 4BSD genauer beschrieben , wo die-f
und-i
Optionen wurden hinzugefügt:Eine noch genauere Definition der Funktionsweise von mv enthält der POSIX-Standard , der hinzufügt, dass er
-f
nur dann außer Kraft gesetzt wird,-i
wenn er später in der Befehlszeile auftritt.Das Standardverhalten unterscheidet sich also ein wenig von
-f
. Standardmäßig werden Sie nur dann um Bestätigung gebeten, wenn das Ziel nicht beschreibbar ist. (Dieses Verhalten geht mindestens bis zu V4 zurück , womv
keine Optionen ausgewählt wurden.) Wenn die-i
Option angegeben ist, fordert mv zusätzlich eine Bestätigung an, sobald das Ziel vorhanden ist. Die-f
Option verhindert in beiden Fällen das Fragen (falls es danach auftritt-i
).quelle
-f
Flag verwendet worden wäre, selbst wenn es nicht verwendet worden wäre .isatty(0)
). Auch wenn es stimmt, dass ein späteres-f
Überschreiben vorliegt-i
, bedeutet dies möglicherweise nicht, dass dies dasselbe ist, als wenn keine Argumente angegeben werden.Dies ist nützlich, wenn Sie die Ausführung
mv
auf einen vernünftigen Standardwert festgelegt haben:Wenn Sie dann einen Zug erzwingen möchten, funktioniert Folgendes:
Da es die letzte Option im erweiterten Befehl ist, die zählt:
Dieser Punkt wird auch im GNU Coreutils-Handbuch erwähnt .
quelle
alias mv="mv -i"
der Grund für die Existenz von ist-f
.mv(1)
(und anderen Unix-Befehlen) als "wahnsinnig" zu bezeichnen, wie Sie-i
glaube ich, dass jeder, der die Befehlszeile seit mehr als ein paar Jahren benutzt, vonmv
irgendwann einmal verbrannt wurde .Es existiert, weil (
man mv
)Sie können also ein Skript / einen Alias / eine Funktion haben, die immer fragt, aber Sie können die Option trotzdem überschreiben.
Eine sinnvolle Funktion / ein sinnvolles Skript würde natürlich mehr bewirken (z. B. die Aktion protokollieren).
quelle
alias mv="mv -i"
der Grund für die Existenz von-f
. Sie erwähnen jedoch auch Skripte und Funktionen. Könnten Sie bitte Beispiele mit diesen beiden nennen?mv -f
, daher ist mir immer noch unklar, wie sie ihre Existenz rechtfertigen / erklären. Entschuldigung, wenn ich das Offensichtliche verpasse!mv -i
. Wenn Sie sie verwenden möchten, aber die Interaktion überspringen, verwenden SieMV -f
usw.mv
ohne eine dieser Optionen ist manchmal zu fragen (Ziel nicht beschreibbar und interaktives Terminal), daher wäre dies ein deutlicher Unterschied zwischenmv -f
und\mv
.Der
mv
Befehl selbst kann mit dieser-f
Option unterschiedlich funktionieren , da er versucht, schreibgeschützte Dateien ohne Aufforderung zu überschreiben.Aufgrund von Schreibrechten im Verzeichnis kann Benutzer2 Benutzer1-Dateien in überschreiben
./dir/
, wird jedoch vorher gewarnt.-f
verhindert die Warnung.quelle
Bei der Shell-Programmierung wird häufig -f verwendet, um sicherzustellen, dass Ihre Befehle nicht mit Fehlern abgebrochen werden, oder um das Skript / den Benutzer nach interaktiven Antworten zu fragen, wenn bestimmte Befehle ausgeführt werden. Das Letzte, was Sie möchten, ist, dass Ihr Skript pausiert und auf Benutzereingaben wartet, oder schlimmer noch, dass der falsche Befehl die Standardeingaben übernimmt.
Hinweis: Das Rückgängigmachen eines Alias kann Nebenwirkungen verursachen / beseitigen. Wenn Sie den Befehl auf eine andere Version oder mit zusätzlichen Optionen verschoben haben, führt das Aufheben des Alias zu unerwünschten Nebenwirkungen. Möglicherweise haben Sie ein Alias-Setup mit mv und rm, um einen Papierkorb (oder andere Schutz- / Verfolgungssysteme) zu verwenden. Das Rückgängigmachen des Alias wird dies brechen ...
quelle
-f
Option für cp oder mv garantiert nicht, dass "sie funktionieren". Wenn beispielsweise die Berechtigung nicht ausreicht, funktioniert der Befehl -f nicht. Was Sie damit meinen, ist, dass -f ein Überschreiben ohne Aufforderung erzwingt. Das gegenteilige Flag -i bedeutet, dass interaktives Überschreiben erforderlich ist.isatty(0)
) befinden. Wenn Ihr Skript z. B. als Teil einer Pipe ausgeführt wird, wird es nicht ausgelöst. 2.) Das Hinzufügen-f
ist nicht dasselbe wie das Rückgängigmachen,-i
da esmv -i -f
sich von unterscheidetmv
, siehe Marks Antwort .