J'essaye de faire le contraire de " Détecter si stdin est un terminal ou un tuyau? ".
J'exécute une application qui change son format de sortie car elle détecte un tube sur STDOUT, et je veux qu'elle pense qu'il s'agit d'un terminal interactif afin que j'obtienne la même sortie lors de la redirection.
Je pensais que l'envelopper dans un expect
script ou utiliser un proc_open()
en PHP le ferait, mais ce n'est pas le cas.
Des idées là-bas?
Réponses:
Ah!
La
script
commande fait ce que nous voulons ...Fait le truc!
la source
script
est même disponible dans BusyBox !less -R
endroit où l'entrée du terminal valess -R
, alors vous avez besoin d'une astuce supplémentaire. Par exemple, je voulais une version colorée degit status | less
. Vous devez passer-R
à moins pour qu'il respecte les couleurs, et vous devez utiliserscript
pour obtenirgit status
la couleur de sortie. Mais nous ne voulonsscript
pas garder la propriété du clavier, nous voulons que cela ailleless
. Donc , j'utilise ce maintenant et il fonctionne bien:0<&- script -qfc "git status" /dev/null | less -R
. Ces premiers personnages ferment le stdin pour celui-ci.$-
variable shell pour un "i".Py_Initialize
que je ne voyais pas correctement stdin / stderr.Sur la base de la solution de Chris , j'ai proposé la petite fonction d'aide suivante:
L'aspect original
printf
est nécessaire pour développer correctement les arguments du script$@
tout en protégeant les parties éventuellement entre guillemets de la commande (voir l'exemple ci-dessous).Usage:
Exemple:
la source
--return
option, si votre version de l'script
a, pour conserver le code de sortie du processus enfant.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
Sinon, un fichier nommétypescript
sera créé à chaque fois qu'une commande est exécutée, dans de nombreux cas.script: illegal option -- f
Le script de suppression de tampon fourni avec Expect devrait gérer cela correctement. Sinon, l'application peut regarder autre chose que ce à quoi sa sortie est connectée, par exemple. la valeur de la variable d'environnement TERM.
la source
Je ne sais pas si c'est faisable à partir de PHP, mais si vous avez vraiment besoin du processus enfant pour voir un TTY, vous pouvez créer un PTY .
En C:
J'avais en fait l'impression que
expect
lui - même crée un PTY, cependant.la source
En référence à la réponse précédente, sous Mac OS X, "script" peut être utilisé comme ci-dessous ...
Mais, comme il peut remplacer "\ n" par "\ r \ n" sur la sortie standard, vous pouvez également avoir besoin d'un script comme celui-ci:
S'il y a un tube entre ces commandes, vous devez vider stdout. par exemple:
la source
Trop nouveau pour commenter la réponse spécifique, mais je pensais faire un suivi sur la
faketty
fonction publiée par ingomueller-net ci-dessus car elle m'a récemment aidé.J'ai trouvé que cela créait un
typescript
fichier que je ne voulais pas / dont je n'avais pas besoin, j'ai donc ajouté / dev / null comme fichier cible du script:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
la source
Mettre à jour la réponse de @ A-Ron à a) travailler à la fois sur Linux et MacOs b) propager le code d'état indirectement (puisque MacOs
script
ne le prend pas en charge)Exemples:
la source
J'essayais d'obtenir des couleurs lors de l'exécution
shellcheck <file> | less
, j'ai donc essayé les réponses ci-dessus, mais elles produisent cet effet bizarre où le texte est décalé horizontalement de l'endroit où il devrait être:(Pour ceux qui ne connaissent pas shellcheck, la ligne avec l'avertissement est censée s'aligner avec l'endroit où se trouve le problème.)
Pour que les réponses ci-dessus fonctionnent avec shellcheck, j'ai essayé l'une des options des commentaires:
Cela marche. J'ai également ajouté
--return
et utilisé des options longues, pour rendre cette commande un peu moins impénétrable:Fonctionne dans Bash et Zsh.
la source
Il y a aussi un programme pty inclus dans l'exemple de code du livre "Programmation avancée dans l'environnement UNIX, deuxième édition"!
Voici comment compiler pty sur Mac OS X:
la source