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.


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.


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.