Nützliches Beispiel für ls -b, --escape


7

Ich bin neu in Ubuntu und lerne die lsArgumente.

Ich habe die -b, --escapeArgumente getestet , (print C-style escapes for nongraphic characters)aber kein nützliches Beispiel für die Verwendung gefunden.

Ich habe eine Datei mit dem Namen \*\?\¿\º\ª\?\¿\&\%\$\·SpecialCharacterfile.txtmit erstellt touch, aber wenn ich sie verwende lsoder ls -bsie auflistet.

*?¿ºª?¿&%$·SpecialCharacterfile.txt

Ich benutze Ubuntu 14.04.5 LTS


Ich denke , diese Frage ist ein nützliches Beispiel: superuser.com/q/1184001/326546
kasperd

Antworten:


13

Alle Ihre Charaktere sind grafisch (sie haben sichtbare Glyphen). Versuchen Sie es mit einem Dateinamen, der Leerzeichen und unsichtbare Zeichen enthält:

$ touch $'\n\t\b\a\b'
$ ls -b
\n\t\b\a\b
$ echo *


$ printf "%q\n" *
$'\n'$'\t'$'\b'$'\a'$'\b'

Ein wirklich nützliches Beispiel, bei dem die Ausgabe ansonsten schwierig wäre: Dateinamen, in die versehentlich das \rZeichen eingefügt wurde, weil DOS-Dateiendungen irgendwo mitten in einer Operation im Weg waren:

$ od -c file-list 
0000000   s   o   m   e   -   f   i   l   e   .   t   x   t  \r  \n
0000017
$ xargs -a file-list touch
$ ls -b
\n\t\b\a\b  file-list  some-file.txt\r

Ich habe dies tatsächlich in einem Beitrag auf U & L gesehen. Persönlich würde ich normalerweise ls -qzum Einfügen in die Befehlszeile selbst verwenden:

$ ls -q
''$'\n\t\b\a\b'  ' '   file-list  'some-file.txt'$'\r'

Das Standardverhalten in neueren Versionen von lsist ls -qfür die interaktive Verwendung: Warum schließt 'ls' Elemente plötzlich mit Leerzeichen in einfache Anführungszeichen ein?


Huh wow! ls -q macht es möglicherweise sicher, die Ausgabe von ls in Shell-Skripten tatsächlich zu analysieren.
Joshua

@Joshua Wenn Sie ls -qdann mindestens eine andere Skriptsprache als Shell haben, haben Sie die Möglichkeit, kein Shell-Skript zu schreiben. Dies ist immer die richtige Wahl für alles, was kompliziert genug ls -qerscheint und nützlich erscheint.
zwol

@zwol: Wie ls -qimpliziert das Vorhandensein einer Nicht-Shell-Skriptsprache die Verfügbarkeit?
R .. GitHub STOP HELPING ICE

@R .. Nicht wirklich sicher, aber vielleicht geht die Annahme, dass die einzigen Systeme, die derzeit ein lsmit einem -qFlag bereitstellen, Systeme sind, die einen anderen Skriptinterpreter verwenden.
mtraceur

@Joshua Die meiste Zeit ermöglichte Shell-Globbing ohnehin eine sichere Iteration über eine Liste von Dateien. Bei Bedarf ermöglichte eine lsumfassende Sorgfalt jedoch immer eine sichere Analyse der lsAusgabe. Tatsächlich habe ich eine sehr portable Shell-Polydatei für einen escevalBefehl geschrieben, die eine portable Shell -zitierte Version jedes Arguments unter github.com/mentalisttraceur/esceval druckt (Shell-Polyfill befindet sich im shVerzeichnis, mit einer C-Version für die Leistung). . esceval *Sie erhalten die Dateinamen, die sicher evalals Originale dienen. Mit äußerster Sorgfalt reicht dies aus, um die lsAusgabe richtig zu handhaben .
mtraceur

6

Beispiel Ich fand mich

$ touch "Hello This is my file"
$ ls
Hello This is my file

Mit -bOption

$ ls -b
Hello\ This\ is\ my\ file

Ist die zweite nicht besser, wenn ich die Ausgabe an einer anderen Stelle in meinem Code verwenden möchte?


4

Die Art und Weise, wie Sie die Dateien erstellt haben, bestand wahrscheinlich darin, den Test direkt einzufügen. Um Dateien mit Backslash-Escapezeichen zu erstellen, müssen Sie die $'...'Art des Zitierens verwenden.

Das Erstellen von Dateien sollte daher wie folgt erfolgen:

$ touch one$'\n'two  three$'\t'four

Und das ls -bwird uns ihre Darstellung zeigen:

$ ls -b                                                    
one\ntwo  three\tfour

Während Standard lsnicht:

$ ls
one?two  three?four

Beachten Sie, dass Backslash-Escapezeichen in Dateien Ihre Skripte beschädigen können . Daher sollte man niemals ls analysieren . Und genau der Hauptzweck für ls -b- zu sehen, welche Dateinamen haben und möglicherweise Fehler zu beheben.


2
+1 für die explizite Erklärung, wie Dateien mit nicht grafischen Zeichen erstellt werden
Zanna

4

Zusätzlich zu Murus Antwort, die erklärt, dass keines der Zeichen in Ihrem Dateinamen nicht grafisch ist, möchte ich darauf hinweisen, dass Ihr Dateiname tatsächlich keine Backslashes enthält (die Shell entfernt sie natürlich, wenn Sie den Befehl ausführen).

Wenn dies -bder Fall wäre , würden sie mit Escapezeichen gedruckt:

$ touch 'hi\(zanna' hi\(zanna
$ ls
hi(zanna  hi\(zanna
$ ls -b
hi(zanna  hi\\(zanna

2
Ja, und deshalb ist das Zitieren in der Shell wichtig. Nicht zitierte Variablen / Zeichenfolgen unterliegen der Shell-Erweiterung und der Entfernung von Backslash-Escapezeichen.
Sergiy Kolodyazhnyy
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.