redirecionamento de stdin para o script que pede a entrada

0

Estou tentando obter o script que solicita que a entrada funcione quando o stdin for redirecionado. Pode ser que isso não seja possível, mas eu gostaria de entender o porquê. Aqui está um exemplo:

$ echo 'q = raw_input("question ?"); print "\ngot: ", q' | python -  < <(echo answer)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'answer' is not defined

Eu sei que posso fazer com que isso funcione:

$ python <(echo 'q = raw_input("question ?"); print "\ngot: ", q') < <(echo answer)
question ?
got:  answer

mas esta é uma substituição de processo. É possível fazê-lo funcionar apenas com redirecionamento?

    
por mss 26.03.2017 / 21:48

2 respostas

1

Sim, talvez. Uma maneira é abrir o TTY e interagir com isso:

#!/usr/bin/env expect
package require Tcl 8.5

gets stdin line; puts "stdin: $line"

set tty [open /dev/tty r+]
chan configure $tty -buffering none

puts -nonewline $tty "nimi sina li seme? "
set name [gets $tty]

gets stdin line; puts "stdin: $line"
puts $tty "name: $name"

Que tem resultados assim, dado o acima salvo em ./prompt , chmod +x , instalado expect , etc.

$ (echo foo; echo bar) | ./prompt
stdin: foo
nimi sina li seme? Bob
stdin: bar
name: Bob
$ 
    
por 26.03.2017 / 22:14
1
$ echo 'q = ...' | python -  < <(echo answer)

Isso não vai funcionar, já que você está redirecionando para o stdin do python duas vezes. O (mais recente) redirecionamento de < <(echo answer) entrará em vigor, e python obtém apenas a palavra answer como o script a ser executado.

Abrir /dev/tty (ou mesmo /dev/stderr ) pode funcionar mesmo se stdin for redirecionado.

$ echo foo | python -c 'import sys; 
     s = sys.stdin.readline(); 
     print "from stdin:", s; 
     t = open("/dev/tty", "r"); 
     s = t.readline(); 
     print "from tty:", s;'

Claro que isso requer que o script esteja rodando com um tty, e não do cron ou similar.

    
por 26.03.2017 / 22:29