Estoy tratando de hacer lo contrario de "¿ Detectar si stdin es un terminal o una tubería? ".
Estoy ejecutando una aplicación que está cambiando su formato de salida porque detecta una tubería en STDOUT, y quiero que piense que es una terminal interactiva para que obtenga la misma salida al redirigir.
Estaba pensando que envolverlo en un expectscript o usar un proc_open()en PHP lo haría, pero no lo hace.
¿Alguna idea por ahí?

Respuestas:
¡Ajá!
El
scriptcomando hace lo que queremos ...¡Hace el truco!
fuente
scriptincluso está disponible en BusyBox !less -Rdonde va la entrada del terminalless -R, entonces necesita algunos trucos adicionales. Por ejemplo, quería una versión colorida degit status | less. Debe pasar-Ra menos para que respete los colores, y debe usarscriptpara obtenergit statusel color de salida. Pero no queremosscriptmantener la propiedad del teclado, queremos que esto vaya aless. Así que utilizo esto ahora y funciona bien:0<&- script -qfc "git status" /dev/null | less -R. Esos primeros caracteres cierran stdin para este comando.$-variable de shell una "i".Py_Initializeno veía stdin / stderr adecuado.Basado en la solución de Chris , se me ocurrió la siguiente pequeña función auxiliar:
La apariencia peculiar
printfes necesaria para expandir correctamente los argumentos de la secuencia de comandos al$@tiempo que protege las partes posiblemente citadas del comando (vea el ejemplo a continuación).Uso:
Ejemplo:
fuente
--returnopción, si su versión de lascripttiene, para preservar el código de salida del proceso hijo.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }contrario, setypescriptcreará un archivo llamado cada vez que se ejecute un comando, en muchos casos.script: illegal option -- fEl script de unbuffer que viene con Expect debería manejar esto bien. Si no, la aplicación puede estar buscando algo diferente a lo que está conectada su salida, por ejemplo. en qué está configurada la variable de entorno TERM.
fuente
No sé si es factible desde PHP, pero si realmente necesita el proceso secundario para ver un TTY, puede crear un PTY .
C ª:
Sin
expectembargo, en realidad tenía la impresión de que sí crea un PTY.fuente
En referencia a la respuesta anterior, en Mac OS X, el "script" se puede usar como a continuación ...
Pero, como puede reemplazar "\ n" con "\ r \ n" en el stdout, también puede necesitar un script como este:
Si hay alguna tubería entre estos comandos, debe vaciar stdout. por ejemplo:
fuente
Demasiado nuevo para comentar sobre la respuesta específica, pero pensé en hacer un seguimiento de la
fakettyfunción publicada por ingomueller-net arriba ya que recientemente me ayudó.Descubrí que esto estaba creando un
typescriptarchivo que no quería / necesitaba, así que agregué / dev / null como el archivo de destino del script:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }fuente
Actualización de la respuesta de @ A-Ron a a) funciona en Linux y MacOs b) propaga el código de estado indirectamente (ya que MacOs
scriptno lo admite)Ejemplos:
fuente
shellcheck <file> | lessIntenté obtener colores al ejecutar , así que probé las respuestas anteriores, pero producen este extraño efecto donde el texto se desplaza horizontalmente desde donde debería estar:(Para aquellos que no están familiarizados con shellcheck, se supone que la línea con la advertencia se alinea con el problema).
Para que las respuestas anteriores funcionen con shellcheck, probé una de las opciones de los comentarios:
Esto funciona. También agregué
--returny usé opciones largas, para hacer que este comando sea un poco menos inescrutable:Trabaja en Bash y Zsh.
fuente
¡También hay un programa pty incluido en el código de muestra del libro "Programación avanzada en el entorno UNIX, segunda edición"!
Aquí se explica cómo compilar pty en Mac OS X:
fuente