it-swarm.com.de

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

Ich bin neu in Ubuntu und lerne die ls Argumente.

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

Ich habe eine Datei mit dem Namen \*\?\¿\º\ª\?\¿\&\%\$\·SpecialCharacterfile.txt mit touch erstellt, aber wenn ich ls oder ls -b verwende, wird dieselbe Liste angezeigt.

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

Ich benutze Ubuntu 14.04.5 LTS

7
Pau Chorro

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 aktuelles nützliches Beispiel, bei dem die Ausgabe ansonsten schwierig wäre: Dateinamen, in die versehentlich das Zeichen \r eingefügt wurde, weil DOS-Dateienden irgendwo in der Mitte eines Vorgangs störten:

$ 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 das tatsächlich in einem Beitrag auf U & L gesehen. Persönlich würde ich normalerweise ls -q zum Kopieren und 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 ls ist ls -q für die interaktive Verwendung: Warum werden Elemente plötzlich in einfache Anführungszeichen gesetzt?

13
muru

Beispiel fand ich mich

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

Mit der Option -b

$ 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?

6

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

So sollte das Erstellen von Dateien sein:

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

Und der ls -b wird uns ihre Darstellung zeigen:

$ ls -b                                                    
one\ntwo  three\tfour

Während der Standardwert ls nicht:

$ ls
one?two  three?four

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

4

Zusätzlich zu Murus Antwort , das erklärt, dass keines der Zeichen in Ihrem Dateinamen nicht grafisch ist, werde ich darauf hinweisen, dass Ihr Dateiname keine Backslashes enthält (die Shell entfernt sie, wenn der Befehl von ausgeführt wird Kurs)

Wenn ja, würde -b dazu führen, dass sie mit Escapezeichen gedruckt werden:

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