Ich versuche das Gegenteil von " Erkennen, ob stdin ein Terminal oder eine Pipe ist? " Zu tun .
Ich führe eine Anwendung aus, die ihr Ausgabeformat ändert, weil sie eine Pipe in STDOUT erkennt, und ich möchte, dass sie denkt, dass es sich um ein interaktives Terminal handelt, damit ich bei der Umleitung dieselbe Ausgabe erhalte.
Ich dachte, dass es in ein expect
Skript verpackt oder proc_open()
in PHP verwendet werden würde, aber das tut es nicht.
Irgendwelche Ideen da draußen?
Antworten:
Aha!
Der
script
Befehl macht was wir wollen ...Macht den Trick!
quelle
script
ist sogar in BusyBox verfügbar !less -R
in die Terminaleingabeless -R
, benötigen Sie zusätzliche Tricks. Zum Beispiel wollte ich eine farbenfrohe Version vongit status | less
. Sie müssen zu-R
weniger übergeben, damit die Farben berücksichtigt werden, und Sie müssen verwendenscript
, umgit status
zur Ausgabe der Farbe zu gelangen . Aber wir wollen nichtscript
das Eigentum an der Tastatur behalten, wir wollen, dass dies geschiehtless
. Also benutze ich das jetzt und es funktioniert gut :0<&- script -qfc "git status" /dev/null | less -R
. Diese ersten paar Zeichen schließen stdin für diesen einen Befehl.$-
Shell-Variable nach einem "i" durchsucht.Py_Initialize
ausführte, stürzte sie immer ab, weil nicht das richtige stdin / stderr angezeigt wurde.Basierend auf Chris 'Lösung habe ich mir die folgende kleine Hilfsfunktion ausgedacht:
Das skurrile Aussehen
printf
ist erforderlich, um die Argumente des Skripts korrekt zu erweitern und$@
gleichzeitig möglicherweise zitierte Teile des Befehls zu schützen (siehe Beispiel unten).Verwendung:
Beispiel:
quelle
--return
Option verwenden, wenn Ihre Version von siescript
hat, um den Exit-Code des untergeordneten Prozesses beizubehalten.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
Andernfallstypescript
wird in vielen Fällen bei jeder Ausführung eines Befehls eine Datei mit dem Namen erstellt.script: illegal option -- f
Das mit Expect gelieferte Unpuffer- Skript sollte dies in Ordnung bringen. Wenn nicht, betrachtet die Anwendung möglicherweise etwas anderes als das, mit dem ihre Ausgabe verbunden ist, z. auf was die Umgebungsvariable TERM eingestellt ist.
quelle
Ich weiß nicht, ob es mit PHP machbar ist, aber wenn Sie den untergeordneten Prozess wirklich benötigen, um ein TTY zu sehen, können Sie ein PTY erstellen .
In C:
Ich hatte tatsächlich den Eindruck, dass
expect
selbst ein PTY entsteht.quelle
Unter Bezugnahme auf die vorherige Antwort kann unter Mac OS X "Skript" wie folgt verwendet werden ...
Da es jedoch "\ n" im stdout durch "\ r \ n" ersetzen kann, benötigen Sie möglicherweise auch ein Skript wie das folgende:
Wenn sich zwischen diesen Befehlen eine Pipe befindet, müssen Sie stdout leeren. beispielsweise:
quelle
Zu neu, um die spezifische Antwort zu kommentieren, aber ich dachte, ich würde die
faketty
Funktion von ingomueller-net weiter oben verfolgen, da sie mir kürzlich geholfen hat.Ich stellte fest, dass dies eine
typescript
Datei erstellte, die ich nicht wollte / brauchte, also fügte ich / dev / null als Skript-Zieldatei hinzu:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
quelle
Aktualisierung der Antwort von @ A-Ron auf a) Arbeiten unter Linux und MacOs b) Weitergabe des Statuscodes indirekt (da MacOs
script
ihn nicht unterstützen)Beispiele:
quelle
Ich habe versucht, beim Laufen Farben zu erhalten
shellcheck <file> | less
, daher habe ich die obigen Antworten ausprobiert, aber sie erzeugen diesen bizarren Effekt, bei dem der Text horizontal von der Stelle versetzt ist, an der er sein sollte:(Für diejenigen, die mit Shellcheck nicht vertraut sind, sollte die Zeile mit der Warnung mit der Stelle übereinstimmen, an der das Problem liegt.)
Um die obigen Antworten für die Arbeit mit Shellcheck zu erhalten, habe ich eine der Optionen aus den Kommentaren ausprobiert:
Das funktioniert. Ich habe auch
--return
lange Optionen hinzugefügt und verwendet, um diesen Befehl etwas weniger unergründlich zu machen:Arbeitet in Bash und Zsh.
quelle
Der Beispielcode des Buches "Erweiterte Programmierung in der UNIX-Umgebung, zweite Ausgabe" enthält auch ein Pty-Programm!
So kompilieren Sie pty unter Mac OS X:
quelle