Ich habe versehentlich eine Datei mit dem Namen -
(zB seq 10 > -
) erstellt. Dann habe ich versucht, less
es anzuzeigen, aber es hängt nur.
Ich verstehe, dass dies geschieht, weil less -
Eingaben von erwartet werden stdin
, so dass es nicht -
als Dateiname interpretiert wird . Ich habe es versucht, less \-
aber es funktioniert auch nicht.
Gibt es eine Möglichkeit, anzuzeigen, less
dass -
es sich um eine Datei und nicht um stdin handelt?
Das Beste, was ich bekommen konnte, ist:
find -name '-' -exec less {} +
-
ist anders.-
ist keine Option.-
wird nicht als Option behandelt, das ist ein völlig anderes Problem als bei Argumenten, die zufällig wie Optionen geformt sind.-
einzelne Anführungszeichen in Anführungszeichen'-'
oder Escapezeichen zu setzen,\-
da dies-
kein Sonderzeichen für allgemeine Shells ist (zumindest POSIX-konforme). Das Ergebnis ist das gleiche.Antworten:
Stellen Sie einfach Folgendes voran
./
:Oder verwenden Sie die Umleitung:
Beachten Sie, dass, da
-
(im Gegensatz zu-x
oder--foo--
zum Beispiel) ein spezieller Dateiname anstelle einer Option betrachtet wird, Folgendes nicht funktioniert:quelle
find -name '-' -exec less {} +
läuft.-
und./-
(oder/path/to/-
oder../to/-
) sind zwei (4) gültige Pfade zu dieser-
Datei, aber ein-
Argument ist speziell fürless
(bedeutet, aus stdin lesen), während./-
es nicht speziell ist.find -name '-' -exec less {} +
ist das nicht standardisierte Formular fürfind . -name '-' -exec less {} +
. Es steigt den Baum bei ab.
und findet Dateien und übergibt die Pfade dieser Dateien als Argumente anless
. Ersetzen Sie-exec less
durch, um-exec echo less
zu sehen, was gerade ausgeführt wird.--
ist das Ende der Optionen zu markieren. Hier hilft es nicht. Dies-
ist keine Option, sondern ein spezielles Argument, das keine Option ist. Siehe auch unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
wird von getopt () behandelt, um das Ende von Optionen zu markieren, wird von getopt ()-
nicht als Option erkannt, so dass-
als normales Argument erkannt wird, ob angegeben--
oder nicht. Und als normales Argument wird es,less
wie die meisten Textdienstprogramme, als stdin behandelt, was wir hier nicht wollen.Ich würde es einfach tun
mv - f && less f
. Problem gelöst.quelle
Hinweis: Meine Antwort ist im Fall des OP NICHT gültig und gilt nur für Werkzeuge, die der unten genannten Konvention folgen, und nicht für eine Datei mit dem Namen genau nur
-
(Bindestrich). Dies ist häufig auch ein Sonderfall, um diese Ablesung aus dem Standard anzugeben Eingabe wird erwartet. Siehe die akzeptierte Antwort.Lassen Sie dies hier, da es nützliche Informationen für andere Fälle enthält, auf die man bei der Suche nach Antworten stoßen kann.
Double-Dash es!
Verwenden Sie die Standardkonvention double-dash (
--
), um das letzte Argument anzugeben:Beispiel
Was ist los?
Dieses
--
Argument stammt aus einer Konvention, die von den meisten Implementierungen von Shell-Dienstprogrammen und Befehlszeilentools unterstützt wird, und die meisten Shells werden sichtbar dafür plädieren, dass Sie beim Implementieren von CLI-Tools die Konvention befolgen sollten.Empfohlen von der Open Group
Die OpenGroup erwähnt es auch im Abschnitt Utility description defaults (v6) ihrer Basisspezifikation:
Und in den Utility-Syntaxrichtlinien (v7):
Empfohlen von Bash
Hier ein Auszug aus dem Bash-Handbuch über die eingebauten Funktionen, die es unterstützen:
Zusätzliche Lektüre
quelle
-
den es keine Option gibt. Verwenden./-
oder Umleiten, wenn möglich, ist im Allgemeinen ein besserer Ansatz, da andere Arten von Problemen wie dasfoo=bar
vonawk
oder das vermieden werden-
. Siehe auch unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
werde immer noch versuchen von stdin zu lesen.