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 expect
script o usar un proc_open()
en PHP lo haría, pero no lo hace.
¿Alguna idea por ahí?
Respuestas:
¡Ajá!
El
script
comando hace lo que queremos ...¡Hace el truco!
fuente
script
incluso está disponible en BusyBox !less -R
donde va la entrada del terminalless -R
, entonces necesita algunos trucos adicionales. Por ejemplo, quería una versión colorida degit status | less
. Debe pasar-R
a menos para que respete los colores, y debe usarscript
para obtenergit status
el color de salida. Pero no queremosscript
mantener 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_Initialize
no 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
printf
es 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
--return
opción, si su versión de lascript
tiene, para preservar el código de salida del proceso hijo.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
contrario, setypescript
creará un archivo llamado cada vez que se ejecute un comando, en muchos casos.script: illegal option -- f
El 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
expect
embargo, 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
faketty
función publicada por ingomueller-net arriba ya que recientemente me ayudó.Descubrí que esto estaba creando un
typescript
archivo 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
script
no lo admite)Ejemplos:
fuente
shellcheck <file> | less
Intenté 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é
--return
y 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