Wie deaktiviere ich Terminal Control-Escape-Sequenzen in Linux?

4222
Angelo

Ich schreibe Software, die mit einem eingebetteten Gerät interagiert, auf dem eine Version von busybox Linux ausgeführt wird. Im Grunde sende ich nur Befehle an das Gerät und analysiere die Ausgabe der Befehle. Die Befehle werden entweder direkt in der Linux-Shell oder in der Befehlszeile einer auf dem Gerät laufenden CLI-Anwendung ausgeführt.

Alles funktioniert gut, außer dass die Ausgabe mit Terminal-Escape-Sequenzen gespickt wird . In Terminalanwendungen wie Teraterm oder Putty bewirken diese Escape-Sequenzen nützliche Funktionen wie Farbfehler, Rot und andere nützliche Funktionen für eine angenehme Benutzeroberfläche.

Das Problem ist, dass ich die Ausgabe der Befehle programmgesteuert analysieren und für Dinge wie "(esc) [2k" in der Ausgabe berücksichtigen muss.

Eine typische Sende-Empfangs-Interaktion, bei der ich einen Befehl sende, "mein-cmd", würde beispielsweise so aussehen ...

[send] my-cmd [receive] my-cmd <esc>[2Kprompt> my-cmd output of the command prompt>  

Was ich wirklich gerne tun würde, ist, diese Fluchtsequenzen zu deaktivieren. Kann man dies zu Beginn einer Sitzung auf der Kommando-Shell tun? Oder gibt es nichts anderes als das Filtern der Ausgabe?

5
Es gibt wahrscheinlich einen besseren Weg, aber Sie können dies möglicherweise auf Befehlsbasis tun. Was sind die Befehle, die Sie senden? Ich denke darüber nach, dass "ls" ein Alias ​​für "ls --colors = tty" ist und grep auf "grep --color" und dergleichen verweist. Sie können die Escape-Sequenzen möglicherweise vermeiden, wenn Sie beispielsweise `/ bin / ls` anstelle von` ls` verwenden. terdon vor 11 Jahren 1
@terdon gibt es einen einfacheren Weg. Verwenden Sie einfach "\ ls" anstelle von "ls" und es werden alle Aliase umgangen. mnmnc vor 11 Jahren 1
@mnmnc Netter, das wusste ich nicht, danke! terdon vor 11 Jahren 0
Wow, danke! Ich werde das mit den Shell-Befehlen versuchen. Trifft das Backslash-Präfix auf _all_ Shell-Befehle zu? Schade, dass es keine Möglichkeit gibt, das Verhalten global abzuschalten. Ich muss auch hoffen, dass sich die internen Befehle richtig verhalten. Angelo vor 11 Jahren 0
Ich habe gerade vor einer halben Stunde davon erfahren, aber es ist eigentlich eine Art zu zitieren. Ein Befehlsname in Anführungszeichen bewirkt, dass BASH alle Aliasnamen ignoriert. Es sollte mit allen _aliases_ nicht allen Befehlen funktionieren, aber in den meisten Fällen, in denen Sie Farbausgabe ohne Angabe einer Option haben, handelt es sich um Aliase. Schauen Sie [hier] (http://stackoverflow.com/q/6162903/1081936) nach weiteren Informationen. terdon vor 11 Jahren 1
Das Umleiten der Ausgabe (z. B. durch "cat" in eine Datei oder eine Named Pipe) kann ebenfalls funktionieren. Sie erhalten auch eine vollständige (nicht abgeschnittene) Ausgabe von Befehlen wie "ps aux", die häufig unter nicht ausreichend breiten Bildschirmen leiden. Daniel Beck vor 11 Jahren 1

2 Antworten auf die Frage

3
terdon

Most (if not all) cases where a *nix command prints colored output without the user specifically asking for it with an option involve aliases. In fact, many Linux distributions include an alias for ls and grep specifying colors in the global /etc/bash.bashrc.

These are from my Linux Mint Debian Edition:

$ grep alias /etc/bash.bashrc alias ls='ls --color=auto' alias grep='grep --colour=auto' 

So, if your program is calling these commands through BASH, you are running ls --color=auto instead of ls.

You can bypass aliases in BASH (maybe other shells too but I have not tried it) by the following methods (taken from here):

  1. the full pathname of the command: /bin/ls

  2. command substitution: $(which ls)

  3. the command builtin: command ls

  4. double quotation marks: "ls"

  5. single quotation marks: 'ls'

  6. a backslash character: \ls

If you use one of these methods in your software you should not have to worry about escape sequences.

0
xyzzy71

Wenn Sie mit einem Redhat oder einem Verwandten, wie Fedora oder Centos, arbeiten, können Sie
Änderungen vornehmen

/etc/sysconfig/init 

Suchen Sie nach den Zeilen, die etwas sagen:

 # anything else => new style bootup without ANSI colors or positioning  BOOTUP=color 

und wie es heißt, ändern Sie die Variable in etwas anderes als "Farbe"

Dies wirkt sich auf das Verhalten einiger Systembefehlszeilen-Dienstprogramme aus, z.