Wie kann bei einem Befehl, der sein Verhalten ändert, wenn seine Ausgabe an ein Terminal gesendet wird (z. B. Ausgabe in Farbe), diese Ausgabe in einer Pipeline umgeleitet werden, während das geänderte Verhalten beibehalten wird? Dafür muss es einen Nutzen geben, den ich nicht kenne.
Einige Befehle grep --color=always
haben Optionsflags, um das Verhalten zu erzwingen, aber die Frage ist, wie Programme umgangen werden können, die ausschließlich auf dem Testen ihres Ausgabedateideskriptors beruhen.
Wenn es darauf ankommt, läuft meine Shell bash
unter Linux.
Antworten:
Sie erhalten möglicherweise, was Sie benötigen, indem Sie verwenden
unbuffer
.unbuffer
ist eintcl
/expect
script. Schauen Sie sich die Quelle an, wenn Sie möchten. Beachten Sie auch den Abschnitt CAVEATS in man.Beachten Sie auch, dass keine Aliase wie die folgenden ausgeführt werden:
es sei denn, man fügt einen von Stéphane Chazelas angegebenen Trick hinzu:
Wenn Sie a machen
alias unbuffer='unbuffer '
(beachten Sie das nachstehende Leerzeichen), werden die Aliase danach erweitertunbuffer
.quelle
alias unbuffer='unbuffer '
(beachten Sie das nachstehende Leerzeichen), werden die Aliase danach erweitertunbuffer
.unbuffer
es ist!sudo apt install expect
- Das war unklar.Eine Geschichte von Werkzeugen
Sie sind nicht die erste Person, die ein solches Werkzeug haben möchte. Seit 30 Jahren wollen die Leute solche Werkzeuge. Und die gibt es auch schon fast so lange.
Das früheste Werkzeug für diese Art von Dingen war Daniel J. Bernsteins "Pty" -Paket, das von Rich Salz als "Ginsu-Messer" beschrieben wurde und das Bernstein um die Wende der 1990er Jahre schrieb, um Nethack zu betrügen (sic!). Version 4 des Pakets "pty" wurde 1992 veröffentlicht
comp.sources.unix
(Band 25, Ausgaben 127 bis 135). Es ist immer noch im World Wide Web zu finden. Paul Vixie beschrieb es damals:Bernstein aktualisierte dies später, irgendwann am oder vor dem 07.04.1999, mit einem "ptyget" -Paket, das er ankündigte:
Dieses separate Paket war das "Sess" -Paket.
"ptyget" ist übrigens ein Beispiel für eine sehr frühe Version von Bersteins "Redo" -Build-System und eine der wenigen veröffentlichten Instanzen.
dependon
ist ein klarer Vorläufer vonredo-ifchange
.Verwendung
ptybandage
ptybandage
ist, was Leute normalerweise in einer LOGON-Sitzung wünschen. Der primäre Anwendungsfall besteht darin, Programme so zu konfigurieren, dass sie empfindlich darauf reagieren, ob ihre Standardeingaben, -ausgaben oder -fehler mit Terminals verbunden sind, obwohl sie sich in Shell-Pipelines befinden oder ihre Standarddateideskriptoren in eine Datei umgeleitet werden.Zum Ausführen wird ein Befehl benötigt (dies muss natürlich ein ordnungsgemäßer externer Befehl sein), und der Befehl wird so ausgeführt, dass er denkt, dass seine Standardeingabe, -ausgabe und -fehler an ein Terminal angeschlossen sind, das diese mit
ptybandage
's' verbindet ursprüngliche Standardeingabe, Ausgabe und Fehler.Es befasst sich mit den Nuancen der Ausführung unter Jobsteuerungs-Shells, wobei sichergestellt wird, dass ein Terminal-STOP-Zeichen nicht nur stoppt,
ptybandage
sondern auch das Programm anhält, das mit dem inneren Terminal verbunden ist.ptyrun
ptyrun
ist das, was die Leute normalerweise von TCP-Netzwerkservern erwarten. Der primäre Anwendungsfall sind Remote-Ausführungsumgebungen, in denen keine Terminals eingerichtet sind und Programme ausgeführt werden, die nicht wie gewünscht funktionieren, wenn kein Terminal vorhanden ist.Es wird nicht erwartet, dass es unter einer Jobsteuerungs-Shell ausgeführt wird, und wenn der ausgeführte Befehl ein Stoppsignal empfängt, wird er einfach neu gestartet.
Verfügbare Toolsets
Dru Nelson veröffentlicht sowohl "pty" Version 4 als auch "ptyget".
Paul Jarc veröffentlicht eine feste Version von ptyget, die versucht, die betriebssystemspezifischen Pseudo-Endgeräte-Ioctls im Original zu behandeln, die Betriebssysteme eigentlich nicht mehr bereitstellen.
Das nosh-Quellpaket wird mit Workalike
ptybandange
undptyrun
Skripten geliefert , die dasexecline
Tool von Laurent Bercot und die eigenen Pseudo-Terminal-Verwaltungsbefehle des nosh-Pakets verwenden. Ab der nosh-Version 1.23 sind diese im nosh-terminal-extras-Paket enthalten. (Frühere Versionen haben sie nur an Personen geliefert, die aus dem Quellcode erstellt haben.)Ein paar Anwendungsbeispiele
Jurjgen Oskam verwendet
ptybandage
unter AIX , um Eingaben aus einem Here-Dokument in ein Programm einzugeben, das explicity öffnet, und liest sein steuerndes Terminal für eine Kennwortabfrage:Andy Bradford benutzt
ptyrun
OpenBSD unter daemontools und ucspi-tcp, um dasbgplgsh
interaktive Router-Steuerungsprogramm über das Netzwerk zugänglich zu machen, während er denkt, dass es mit einem Terminal spricht:Weitere Lektüre
redo
. Häufig gestellte Fragen.bgplgsh
. 8. OpenBSD-Handbuchseiten.quelle
expect
?Sie können mit socat Ihren Prozess mit einem beginnen pty verbunden und bekommen socat das andere Ende des pty in eine Datei zu verbinden. Welche AFAIU ist genau das, was Sie gefragt haben:
Diese Methode führt dazu, dass der
isatty
Aufruf vonmy-command
zurückgegeben wird,true
und ein Prozess, der sich nur darauf stützt, wird getäuscht, um Steuercodes auszugeben. Beachten Sie, dass einige Prozesse (insbesonderegrep
) auch den Wert derTERM
Umgebungsvariablen überprüfen , sodass Sie ihn möglicherweise auf einen vernünftigen Wert wie festlegen müssen"xterm"
quelle
Es gibt auch eine nette Lösung, die hier auf Super User von KarlC gepostet wird :
Kompilieren Sie eine kleine gemeinsam genutzte Bibliothek:
Dann weisen Sie Ihren Befehl an, diese
isatty(3)
Überschreibung dynamisch zu laden :Dies funktioniert möglicherweise nicht für jeden Befehl, kann jedoch in den meisten Fällen zu unerwarteten Fehlern führen.
quelle
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
Wie wäre es mit
script(1)
?Beispielsweise:
Speichert die
ls
Ausgabeout_file
unter Beibehaltung der Farbcodes.quelle
out_file
die Farben ausgeben soll ?less -R
. In diesem Fall wollte ich jedoch, dass die Ausgabe in der Pipeline fortgesetzt wird, die schließlich in meinem Terminal landete. Zurcat
Veranschaulichung wurde so etwas verwendetscript -q -c 'ls -G' /dev/null | cat
, das dietypescript
Datei vollständig unterdrückt und nur die Ausgabe des Programms zurücklässt.-
) alsscript
Ausgabedatei, zum Beispiel:script -q -c 'ls -G' -
Basierend auf der Antwort von @ Amir ist hier ein Skript, das die Bibliothek zur Laufzeit generiert und dann einschließt:
quelle