Wie michas erklärt hat , handelt es sich um terminale Escape-Sequenzen. Wie sie interpretiert werden, hängt vom Terminal ab. Sie können tun, was michas vorgeschlagen hat, und ls
like aufrufen \ls
, wodurch die ls
ausführbare Datei $PATH
anstelle des allgemeinen Shell-Alias aufgerufen wird ls --color=auto
. So entfernen Sie diesen Shell-Alias:
unalias ls
Sie können auch die Option hinzufügen ...
ls ${opts} --color=never
... jederzeit auszuschalten. Eine andere Möglichkeit, die Farbsequenzen zu deaktivieren, besteht beispielsweise darin, Folgendes zu tun:
ls ${opts} | cat
Dies funktioniert, da im --color=auto
Modus ls
die Ausgabe überprüft wird, um festzustellen, ob es sich um ein tty-Gerät handelt, und in diesem Fall das Terminal-Escape injiziert, um die Ausgabe einzufärben. Wenn es sich nicht um ein Endgerät handelt - wie wenn es sich stattdessen um eine |pipe
Datei wie im obigen Beispiel handelt - werden ls
keine Escape-Sequenzen gedruckt. Dies ist das Standardverhalten der meisten Anwendungen, die ihre Ausgabe einfärben können.
Interessanter ist jedoch die API, die die meisten ls
Implementierungen zur Steuerung dieses Verhaltens bereitstellen - was ich interessant finde und die mich veranlasst hat, diese Antwort zu schreiben.
ls
Bestimmt anhand der Werte in der $LS_COLORS
Umgebungsvariablen , welche Teile der Ausgabe eingefärbt werden sollen. Die dircolors
Anwendung ist eine Schnittstelle, um dies zu handhaben. Zum Beispiel auf meinem Computer:
dircolors -p
...
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # regular file: use no color at all
RESET 0 # reset to "normal" color
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
... und so weiter. Wenn verglichen mit...
printf %s "$LS_COLORS"
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:\
bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:\
ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:...
... wir können anfangen, eine Vorstellung davon zu bekommen, was ls
tut. Was in keinem von diesen speziell gezeigt wird, sind die in ...
lc=\e[:rc=m:ec=:
Jedes dieser Elemente behandelt die linke Seite eines Terminal-Escape-Codes, die rechte Seite eines Terminal-Escape-Codes und das Ende einer Terminal-Escape-Sequenz. Wie Sie in der dircolors
Ausgabe sehen können, ist my fi=:
nicht als Standard festgelegt, da ls
reguläre Dateien normalerweise nicht eingefärbt werden.
Aber wenn wir all dies zusammen nehmen und ein wenig hinzufügen, können wir Dinge tun wie ...
mkdir dir ; touch file1 file2
LS_COLORS=\
'lc=\nLEFT_SIDE_ESCAPE_SEQUENCE\n:'\
'rc=\nRIGHT_SIDE_ESCAPE_SEQUENCE\n:'\
'ec=\nEND_OF_ESCAPE_SEQUENCE:'\
'fi=REGULAR_FILE_ESCAPE_CODE:'\
'di=DIRECTORY_ESCAPE_CODE:'\
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 $
END_OF_ESCAPE_SEQUENCE$
LEFT_SIDE_ESCAPE_SEQUENCE$
DIRECTORY_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
dir$
END_OF_ESCAPE_SEQUENCE/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file1$
END_OF_ESCAPE_SEQUENCE$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file2$
END_OF_ESCAPE_SEQUENCE$
$
LEFT_SIDE_ESCAPE_SEQUENCE$
$
RIGHT_SIDE_ESCAPE_SEQUENCE$
ls
sollte das ec
Escape einmal am Anfang der Ausgabe und das lc
und Escape einmal am Ende drucken rc
. Jedes zweite Mal, wenn sie auftreten, steht unmittelbar vor oder nach einem Dateinamen. Die ec
Sequenz tritt nur auf, wenn sie festgelegt ist. Standardmäßig wird die Sequenz reset
oder rs
stattdessen in Kombination mit lc
und verwendet rc
. Ihre Ausgabe zeigt eine Konfiguration wie:
`lc=\033[:rc=m:rs=0...`
... was typisch ist, aber ec
Ihnen mehr Kontrolle gewährt. Wenn Sie beispielsweise jemals eine durch \0
Nullen getrennte Null haben wollten ls
, können Sie dies so einfach erreichen wie:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
^@%
Wieder können Sie sehen, dass wir eine zusätzliche erhalten, ec
kurz bevor die erste Escape-Sequenz gedruckt wird, und eine direkt am Ende. Abgesehen von diesen beiden treten \0
Null-Bytes nur unmittelbar vor oder nach einem Dateinamen auf. Sie können sogar sehen, dass der zusätzliche /
Schrägstrich, der zum Anzeigen eines Verzeichnisses verwendet wird, außerhalb der Nullen liegt, die es einschließen.
Dies funktioniert auch für Dateinamen, die neue Zeilen enthalten:
touch 'new
line
file'
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' \
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:43 ^@new$
line$
file^@^@^@$
^@%
Wenn wir all dies zusammen nehmen, können wir vermuten, dass es in Ihrem Fall drei Hauptprobleme gibt, und wenn eines davon angesprochen wird, wird es wahrscheinlich die anderen vermeiden.
- Erstens interpretiert Ihr Endgerät entweder die Escapefarben der Terminals einfach nicht richtig oder
plink
macht sie auf irgendeine Weise für Ihr Terminal unlesbar. Ich bin mir nicht sicher, was wahr ist, aber die plink
Dokumente haben Folgendes zu sagen:
Die vom Server gesendete Ausgabe wird direkt in Ihr Eingabeaufforderungsfenster geschrieben, in dem die Terminalsteuerungscodes höchstwahrscheinlich nicht so interpretiert werden, wie es der Server erwartet. Wenn Sie beispielsweise Vollbildanwendungen ausführen, können Sie erwarten, dass in Ihrem Fenster seltsame Zeichen angezeigt werden. Solche interaktiven Verbindungen sind nicht der Hauptpunkt von Plink.
Um mit einem anderen Protokoll zu verbinden, können Sie die Befehlszeilenoptionen geben -ssh
, -telnet
, -rlogin
oder -raw
. So stellen Sie eine SSH-Verbindung her:
Z:\sysosd>plink -ssh login.example.com
login as:
Wenn Sie bereits eine gespeicherte PuTTY-Sitzung eingerichtet haben, können Sie anstelle eines Hostnamens den Namen der gespeicherten Sitzung angeben. Auf diese Weise können Sie die Authentifizierung mit öffentlichem Schlüssel verwenden, einen Benutzernamen angeben und die meisten anderen Funktionen von PuTTY verwenden:
Z:\sysosd>plink my-ssh-session
Sent username "fred"
Authenticating with public key "fred@winbox"
Last login: Thu Dec 6 19:25:33 2001 from :0.0
fred@flunky:~$
Wenn eine dieser Optionen für Sie entweder nicht funktioniert oder auf andere Weise nicht durchführbar ist, können Sie dies beheben, indem Sie möglicherweise eine Prüfung plink
in Ihrer .${shell}rc
Datei durchführen, die beim Anmelden bezogen wird. Sie könnten dadurch die ermöglichen ls
alias, nur wenn Ihre Login - Gerät ist nicht eine plink
Verbindung. Alternativ können Sie es vermutlich ganz entfernen, aber dies macht es ls
für jede Anmeldesitzung farblos. Sie können dem Anmeldebefehl auch einen unalias ls
oder sogar einen alias ls='ls --color=never
Befehl hinzufügen plink
und dabei den Alias nur entfernen, wenn Sie mit angemeldet sind plink
.
Das letzte Problem besteht darin, dass ls
- unabhängig von den Alias-Befehlszeilenoptionen - eine Umgebung bereitgestellt wird, in der Terminal-Escapezeichen angegeben sind $LS_COLORS
. Ähnlich wie im letzteren Fall von Problem 2 können Sie $LS_COLORS
beim Anmelden mit einfach einen Nullwert festlegen plink
. Auf diese Weise müssen keine Farbcodes gerendert werden, und ls --color=auto
es macht überhaupt keinen Unterschied.