Unix-Tools: Was ist, wenn eine Datei minus etwas heißt?

9

Ich frage mich immer: Die meisten GNU / Unix-Tools verwenden Optionen in der Form "minus etwas", manchmal gefolgt von einem Argument. Was ist, wenn Sie eine Datei mit dem Namen minus etwas haben?

$ ls
-f
$ rm -f
$ ls
-f
$ mv -f abc
mv: missing destination file operand after `abc'
Try `mv --help' for more information.
$ cat -f
cat: invalid option -- 'f'
Try `cat --help' for more information.

oder

$ ls
-ohello.c
$ gcc -ohello -ohello.c
gcc: fatal error: no input files
compilation terminated.

Dies ist nur aus Neugier; Ich habe keinen Anwendungsfall dafür.


quelle
Sie müssen einen Weg finden, die Zeichenfolge "-f" buchstäblich an den Systemaufruf zu übergeben. Normalerweise geschieht dies durch vorsichtiges Entkommen.
Flexo
2
Zum Wähler "Schließen, weil nicht zum Thema": Dies ist eine Frage zur Shell- Programmierung und zur Vermeidung eines Problems. Es ist für SO völlig thematisch. (OTOH, es ist wahrscheinlich ein Duplikat; das Problem besteht darin, die relevante andere Frage zu finden.)
Jonathan Leffler

Antworten:

12

-xVerwenden Sie zum Entfernen einer benannten Datei rm -- -x( --bedeutet Ende der Optionen) oder rm ./-x.

Dan D.
quelle
10

Es ist ziemlich üblich, diese Art von Fragen in Intervieweinstellungen zu stellen. Eine übliche Methode, um Dateien mit Bindestrichen zu behandeln, ist entweder:

$ rm -- -f
$ rm ./-f
William Pursell
quelle
6

Eine häufige Frage in Unix. Die Hauptmethode besteht darin, der Datei den vollständigen Pfadnamen zu geben, damit kein Bindestrich davor steht:

$ rm -file.txt
unknown option -l

$ rm ./-file.txt    #No problem!
$ rm $PWD/-file.txt #Same thing

Bei einigen Befehlen können Sie einen Strich für sich (oder einen doppelten Bindestrich) verwenden, um die Optionen zu beenden. Dies gilt jedoch nicht unbedingt für alle Befehle oder sogar für denselben Befehl auf verschiedenen Systemen.

$ rm -- -file.txt   #Works on Linux but not on some Unix systems
David W.
quelle
4

du musst verwenden

  rm -- <filename>

Ex:

  rm -- -f
saß
quelle
Eine Bemerkung wäre nicht falsch.
Benutzer unbekannt