Estou tentando fazer o oposto de " Detectar se stdin é um terminal ou tubo? ".
Estou executando um aplicativo que está alterando seu formato de saída porque detecta um canal no STDOUT e quero que ele pense que é um terminal interativo para que eu obtenha a mesma saída ao redirecionar.
Eu estava pensando que envolvê-lo em um expect
script ou usar um proc_open()
no PHP faria isso, mas não o faz.
Alguma idéia por aí?
Respostas:
Aha!
O
script
comando faz o que queremos ...Faz o truque!
fonte
script
está disponível até no BusyBox !less -R
onde a entrada do terminal vailess -R
, então precisará de mais truques. Por exemplo, eu queria uma versão colorida degit status | less
. Você precisa passar-R
para menos para respeitar as cores e usarscript
para obtergit status
cores de saída. Mas não queremosscript
manter a propriedade do teclado, queremos que isso ocorraless
. Então, eu uso isso agora e ele funciona bem:0<&- script -qfc "git status" /dev/null | less -R
. Esses primeiros caracteres fecham stdin para esse único comando.$-
variável do shell para um "i".Py_Initialize
não via stdin / stderr adequado.Com base na solução de Chris , criei a seguinte função auxiliar:
A aparência peculiar
printf
é necessária para expandir corretamente os argumentos do script$@
enquanto protege partes do comando possivelmente citadas (veja o exemplo abaixo).Uso:
Exemplo:
fonte
--return
opção, se a sua versãoscript
possui, para preservar o código de saída do processo filho.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
caso contrário, um arquivo nomeadotypescript
será criado sempre que um comando for executado, em muitos casos.script: illegal option -- f
O script unbuffer que acompanha o Expect deve lidar com isso ok. Caso contrário, o aplicativo pode estar procurando algo diferente do que sua saída está conectada, por exemplo. para o qual a variável de ambiente TERM está configurada.
fonte
Não sei se é factível a partir do PHP, mas se você realmente precisar do processo filho para ver um TTY, poderá criar um PTY .
Em C:
Na verdade, eu estava com a impressão de que
expect
ele cria um PTY.fonte
Referindo a resposta anterior, no Mac OS X, "script" pode ser usado como abaixo ...
Mas, como ele pode substituir "\ n" por "\ r \ n" no stdout, você também pode precisar de um script como este:
Se houver algum canal entre esses comandos, você precisará liberar o stdout. por exemplo:
fonte
É novo demais para comentar sobre a resposta específica, mas pensei em
faketty
seguir a função postada pela ingomueller-net acima, pois ela recentemente me ajudou.Eu descobri que isso estava criando um
typescript
arquivo que eu não queria / precisava, então adicionei / dev / null como o arquivo de destino do script:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
fonte
Atualizando a resposta de @ A-Ron para a) trabalho no Linux e MacOs b) propagar o código de status indiretamente (já que o MacOs
script
não o suporta)Exemplos:
fonte
Eu estava tentando obter cores durante a execução
shellcheck <file> | less
, então tentei as respostas acima, mas elas produzem esse efeito bizarro em que o texto é deslocado horizontalmente de onde deveria estar:(Para aqueles que não estão familiarizados com a verificação de shell, a linha do aviso deve estar alinhada com a localização do problema.)
Para que as respostas acima funcionem com o shellcheck, tentei uma das opções dos comentários:
Isso funciona. Também adicionei
--return
e usei opções longas, para tornar este comando um pouco menos inescrutável:Trabalha em Bash e Zsh.
fonte
Há também um programa pty incluído no código de exemplo do livro "Programação Avançada no Ambiente UNIX, Segunda Edição"!
Veja como compilar pty no Mac OS X:
fonte