Existe uma ferramenta semelhante para 'tee' para stdin?

3

tee funciona lendo de stdin e dividindo o fluxo de entrada para stdout e um arquivo.

Estou tentando fazer algo semelhante com o stdin de um processo. Eu gostaria que o stdin de um comando ainda fosse anexado ao tty, ou pseudoterminal e também ser capaz de receber entrada de uma fonte arbitrária, digamos um arquivo.

Eu tentei uma variedade de truques de pipe e redirecionamento de IO e não posso duplicar o cenário desejado do programa vendo o stdin como o terminal.

Isso pode não ser possível, mas imaginei que gostaria de perguntar.

    
por datUser 18.01.2018 / 17:49

2 respostas

2

Não tenho certeza de como um arquivo está envolvido no seu cenário. entrada padrão canalizada pode ser lida em um arquivo temporário (ou mantido na memória) e então o acesso tty restaurado através de algo como

#!/usr/bin/env expect

package require Tcl 8.5
package require fileutil

set tmpfile [::fileutil::tempfile]
while {[gets stdin line] >= 0} {
    puts $tmpfh $line
}

close stdin
open /dev/tty r+

# and here the remainder of the program can interact with the terminal,
# and read from the $tmpfile as necessary

Eu uso esse método para feed entrada padrão no REPL e, em seguida, ligo esse REPL para uso interativo:

$ echo '(print "hello")' | feed - sbcl --noinform
* (print "hello")

"hello"
"hello"
* (quit)
(quit)
$ 
    
por 18.01.2018 / 18:08
3

Você pode escrever um programa que chame select() no tty e em alguma outra fonte, lendo o que vier de qualquer um deles. Mas se a outra fonte é um arquivo, isso não faz sentido: os arquivos sempre podem ser lidos imediatamente, não há espera pela entrada. Então, o resultado seria que você lidaria com o arquivo primeiro, depois com o tty input ou vice-versa. (A menos que o arquivo seja muito grande e você precise realmente aguardar o disco por algum tempo mensurável.)

Para ler um arquivo primeiro e depois tty input / stdin, você pode usar apenas cat file - .

    
por 18.01.2018 / 17:54