Bedeutung von "'" (Apostroph) in Terminalbefehlen

11

Aus irgendeinem seltsamen Grund habe ich "'" als Worttrennzeichen in Bezeichnern versucht, wie in:

$ export foo'bar=1
> 
> ^C
$ 

Das Ergebnis ist , wie oben gezeigt, id est die Eingabeaufforderung ändert sich zu „>“ und das System wartet offensichtlich für weitere Informationen auf meiner Seite. Wie Sie sehen, musste ich Strg-C drücken, um zu entkommen. Das gleiche passiert mit anderen Befehlen wie

$ ls foo'bar
$ mkdir foo'bar

Ich bin neugierig auf den Sinn all dessen, das ist die besondere Bedeutung von "'" in Terminalbefehlen (so besonders, dass es sogar innerhalb von IDs auseinander genommen wird).

Extra: Nebenbei möchte ich auch die Menge der speziellen oder anderweitig ungültigen Zeichen in Datei- und Ordnernamen kennen, sowohl unter Unix-ähnlichen als auch unter Windows-Systemen (um die gemeinsame Teilmenge der sicheren zu erhalten) (insbesondere, was ist mit allem Nicht-ASCII?).

Danke, Denis

denis 63
quelle
In der Linux-Welt sind alle Zeichen außer \ 0 (null) und / zulässig. Das bedeutet jedoch nicht, dass sie alle ratsam sind. Viele Leute halten es für das Beste, Zeichen zu vermeiden, die für die Shell eine besondere Bedeutung haben. Wenn Sie mehr über Windows erfahren möchten, konsultieren Sie eine Windows-Referenz.
Scott Severance

Antworten:

15

Das Zeichen 'ist ein sehr mächtiges Zeichen, wenn es in einem Shell-Befehl verwendet wird. Grundsätzlich deaktiviert das '(Apostroph) alle Arten von Transformationen oder Modifikationen. Es würde alles, was mit den Markierungen eingeschlossen ist, als eine einzelne Entität betrachten, dh als einen einzelnen Parameter. Es würde absolut keine Substitution oder Erweiterung stattfinden.

Beispiel:

 $ echo '$HOME'

würde am Ausgang die Zeichenfolge $HOMEselbst erzeugen und den Pfad zu Ihrem Home-Verzeichnis nicht drucken. Da die einfachen Anführungszeichen jede Art von Erweiterung verhindern, wird durch Ersetzen und Einfaches alles als einfacher Parameter an sich betrachtet.

Wenn Sie den Apostroph so verwenden möchten, wie er ist, müssen Sie ihm entkommen:

 $ mkdir foo\'bar

 $ cd foo\'bar

Wenn es nicht maskiert wird, wartet es darauf, dass das Paar geschlossen wird, wie es in Ihrem ersten Beispiel geschehen ist.

Korrigiert lautet Ihr Befehl also:

 $ export foo\'bar=1

HINWEIS: Wie Milan Todorovic bemerkt hat, ist dies nicht gültig, da Sie in diesem Fall kein Apostroph verwenden können.

Frantique
quelle
1
@ denis63 bitte akzeptieren Sie die Antwort, wenn es das ist, was Sie sehen mussten :)
Rinzwind
7

Charakter 'ist ein Sonderzeichen. Sie markieren damit einen Teil des Befehlszeileneintrags, der nicht geändert wird (z. B. kein Ersatz für Platzhalter). Beispielsweise:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Dies bedeutet, dass das Argument für was lswar bla*und nicht alles, was damit beginnt bla.

Der Grund, warum Sie >Charakter erhalten, ist, dass Sie einen 'zum Öffnen und einen 'zum Schließen eines Teils verwenden müssen, der nicht geändert wird.

Wenn Sie 'in Ordnernamen verwenden möchten, müssen Sie diese wie folgt maskieren : \'. Wenn Sie also einen Ordner mit dem Namen foo'barauflisten möchten, sollten Sie Folgendes eingeben ls foo\'bar.

Oh, und ich bin mir nicht sicher, ob es möglich ist, 'Umgebungsvariablennamen zu verwenden. Ich denke, dass Sie nicht verwenden können export foo\'bar=1,

Hoffe das hilft.

Milan Todorovic
quelle
Stimmen Sie für Ihre Beobachtung zur Einschränkung des Namens von Umgebungsvariablen ab.
Frantique
Ich kann noch nicht upvoten (neu bei askubuntu), aber das Gefühl ist da. Es wurde genau so überprüft, wie Sie sagen. (Ich fühle mich ein bisschen dumm, nicht daran gedacht zu haben, Trennzeichen selbst zu öffnen / zu schließen, aber ich habe dann "'" als einen echten Apostroph betrachtet, nicht als einfaches Anführungszeichen). Denis
Denis 63