Wie erstelle ich eine Datei, die wie ein Befehlszeilenargument benannt ist?

29

Ich habe mich gefragt, wie ich eine Datei mit dem Namen "Flag" erstellen soll. Wenn ich beispielsweise einen Ordner mit dem Namen "Folder" erstellen -amöchte, welche Befehle reichen aus?

Ich habe versucht mkdir '-a', mkdir \-aund weder gearbeitet. Ich bin auf Ubuntu.

MEIN V
quelle
13
Die Antworten hier sind alle großartig, aber ich kann mir keinen Nicht-Troll-Grund
vorstellen
@evilsoup Einige Leute mögen es, Ordner mit Präfixen zu versehen, damit sie in einer alphanumerisch sortierten Liste ganz oben bleiben. Aber das ist der einzige Grund, an den ich denken kann, um ehrlich zu sein.
Slhck
@slhck Ich kenne mindestens einen Videobearbeitungskurs, in dem die Schüler aufgefordert werden, Leerzeichen in die Verzeichnisse ihrer Projekte einzufügen, damit sie auf kommunalen iMacs oben angezeigt werden. Dies war hässlich und führte zu einer urkomischen Eskalation, aber es wäre zumindest kein potenzieller
Systembruch
3
Meistens ist dies aus akademischen Gründen hier.
MYV
5
Obligatorischer Comic: beesbuzz.biz/d/20110224.php
flauschig

Antworten:

49

Rufen Sie den Befehl wie folgt auf:

mkdir -- -a

Das --bedeutet, dass die Optionen danach enden, das -awird also wörtlich interpretiert und nicht als Option dazu mkdir. Sie finden diese Syntax nicht nur in mkdir, sondern in jedem POSIX-kompatiblen Dienstprogramm mit Ausnahme von echound test. Aus der Spezifikation :

Das Argument - sollte als Trennzeichen für das Ende der Optionen akzeptiert werden. Alle folgenden Argumente sollten als Operanden behandelt werden, auch wenn sie mit dem Zeichen '-' beginnen. Das Argument - sollte nicht als Option oder als Operand verwendet werden.

Die Verwendung --als Sicherheitsmaßnahme wird für fast alle Aktionen empfohlen, bei denen Sie sich mit Dateinamen befassen und sicherstellen möchten, dass sie den Befehl nicht unterbrechen. Wenn Sie z. B. Dateien in einer Schleife verschieben, möchten Sie möglicherweise Folgendes aufrufen, damit eine Datei mit dem Namen -iisn ' t (in?) als Option richtig geparst:

mv -- "$f" new-"$f"
slhck
quelle
Der Nachteil dieses Ansatzes ist genau, dass er die Optionsverarbeitung beendet. Für ein einfaches mkdir-Beispiel wirkt das Wunder. Wenn Sie tatsächlich eine Option benötigen, um dem Dateinamen in der Befehlszeile zu folgen, funktioniert dies überhaupt nicht.
ein Lebenslauf
1
Natürlich - alles hat einen Nachteil. In Fällen, in denen Sie sich mit Dateinamen beschäftigen, die mit Optionen durchsetzt sind, ist die Lösung von Amos die einzig vernünftige Alternative, die ich mir vorstellen kann, aber es hängt wirklich davon ab, wie das Tool Optionen analysiert.
Slhck
1
Da es im OP darum geht, eine Datei mit einem Namen "wie ein Befehlszeilenargument" zu erstellen (nehmen wir an, dass der Name mit einem Bindestrich beginnt), halte ich das nicht für eine völlig unzumutbare Annahme. Nehmen Sie cc -o -myfile -Wall -myfile.cals nur wenig erfundenes Beispiel. Jeder Editor, der es wert ist, sollte in der Lage sein, in einer Datei mit dem Namen zu speichern, -myfile.cwenn Sie danach fragen, aber der C-Compiler wird wahrscheinlich nicht das tun, was Sie wollen, wenn er eine solche Liste von Optionen erhält.
ein Lebenslauf
1
@Maksim Zum Beispiel Befehle, für die eine Option zum Festlegen eines Eingabe- oder Ausgabedateinamens erforderlich ist, wie der ccBefehl, den Michael oben gegeben hat, mit der -oOption, die Ausgabedatei anzugeben.
Slhck
1
Die Schleife Beispiel dafür ist , warum Sie immer so etwas wie verwenden sollen , for f in ./*; do...anstattfor f in *; do...
evilsoup
21

Die einfachste Möglichkeit, mit einem vernünftigen Programm zu arbeiten, ist die Verwendung eines relativen Pfadnamens vor dem - , z. B. mkdir ./-awird ein Verzeichnis erstellt, das -aim aktuellen Arbeitsverzeichnis aufgerufen wird .

Das häufigste Beispiel für die Verwendung dieses "Tricks" ist das Entfernen einer Datei, die mit einem Bindestrich beginnt rm ./-a.

Amos Shapira
quelle
3
Das reicht natürlich nur aus, wenn Sie mit Dateipfaden arbeiten und keine willkürlichen Befehlszeilenoptionen, die als Zeichenfolgen analysiert werden. Ansonsten ist das Präfixieren ./immer eine gute Idee - stellen Sie sich vor, Sie haben eine Datei mit dem Namen erstellt -rfund dann mit dem Namen rm *.
Slhck
1
@slhck Für viele Leute könnte das ein Witz sein. Aber ich habe genug Fälle gesehen, in denen so etwas einen Server ausgelöscht hat. Sie können die Leute nicht genug vor den Gefahren warnen, die von Dateien ausgehen, die mit einem Bindestrich beginnen. An einem Ort, an dem ich gearbeitet habe, galt dies sogar als offizielle Regel: Erstellen Sie niemals eine Datei, deren Name mit "-f" oder "-r" beginnt.
Heute,
1
Dies sollte die Antwort sein: Es ist der einzige tragbare Weg ( --wird nicht von allen Befehlen verstanden, nur von wenigen)
Olivier Dulac
@OlivierDulac Ich dachte, das --war eine Bash-Sache, also sollte es für alle Programme funktionieren?
Gsingh2011
@ gsingh2011 nein, der Code, der entscheidet, ob "-" als Markierung für das Ende von Flags angesehen wird, lebt in der Anwendung und es liegt an jeder Anwendung, zu entscheiden, ob er dies so behandelt.
Amos Shapira
4

Der Grund, warum mkdir '-a'oder mkdir \-anicht funktioniert, ist, dass beide Methoden (mit Anführungszeichen oder Backslashes) verwendet werden, um zu verhindern, dass Ihre Shell (wahrscheinlich bash) ihnen eine besondere Bedeutung verleiht. Schon seit-a die Shell ohnehin nichts Besonderes bedeutet, haben diese keinen Einfluss darauf, wie sie weitergeleitet wird mkdir.

Soweit mkdires sich um etwas handelt, erhält es eine Liste von Argumenten aus der Shell, und es kann nicht sagen, ob Sie sie in Anführungszeichen setzen oder ob es einen Backslash gab. Es gibt nur ein Argument -a. Deshalb brauchst du das --wie in den anderen Antworten erklärt.

Hammar
quelle
-3

Neben der Antwort von "slhck" gibt es noch einen anderen Trick, der manchmal funktioniert:

Setzen Sie den fraglichen Dateinamen in 2 Sätze von (verschiedenen) qoutes wie "'-a'"oder '"-a"'.

Ob dies funktioniert oder nicht, hängt vom Programm ab. Es ist jedoch ein letzter Ausweg, wenn das Programm die POSIX- --Funktion nicht unterstützt .
Die POSIX-Methode wird immer bevorzugt, da sie zu 100% zuverlässig ist.

Tonny
quelle
"Die POSIX-Methode wird immer bevorzugt, da sie zu 100% zuverlässig ist." Das Verwenden von, --um die Optionsverarbeitung zu beenden, setzt auch voraus, dass Sie keine Optionen benötigen, um dem Dateinamen zu folgen, was nicht immer der Fall ist.
ein Lebenslauf
@ MichaelKjörling Natürlich ... Aber ich ging irgendwie davon aus, dass das offensichtlich wäre.
Heute,
4
Dadurch wird eine Datei namens '-a'oder erstellt "-a", zumindest auf BSD-Systemen
nohillside
4
Können Sie ein Betriebssystem / eine Shell angeben, in dem / der dies funktioniert ?
Nohillside
1
Wenn es funktionieren würde, hätten Sie anscheinend ein erhebliches Problem mit Dateien, deren Namen von Anführungszeichen umgeben sind.
Muhmuhten