입력이 필요한 스크립트에 대한 stdin 리디렉션

입력이 필요한 스크립트에 대한 stdin 리디렉션

표준 입력이 리디렉션될 때 입력을 요청할 때 작동하도록 스크립트를 얻으려고 합니다. 불가능할 수도 있지만 그 이유를 알고 싶습니다. 예는 다음과 같습니다.

$ 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

나는 그것을 작동시킬 수 있다는 것을 알고 있습니다.

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

그러나 이는 프로세스 대체입니다. 리디렉션만으로 작동하도록 할 수 있나요?

답변1

아마도. 한 가지 방법은 TTY를 열고 상호 작용하는 것입니다.

#!/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"

따라서 위의 결과는 ./prompt, chmod +x, 설치된 expect등에 저장됩니다.

$ (echo foo; echo bar) | ./prompt
stdin: foo
nimi sina li seme? Bob
stdin: bar
name: Bob
$ 

답변2

$ echo 'q = ...' | python -  < <(echo answer)

Python의 표준 입력으로 두 번 리디렉션하기 때문에 작동하지 않습니다. 리디렉션(나중에)이 < <(echo answer)적용되고 Python은 해당 단어를 answer실행할 스크립트로 가져옵니다.

/dev/tty열기 (짝수)는 stdin이 리디렉션되는 경우에도 작동합니다./dev/stderr

$ 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;'

물론 이를 위해서는 cron이나 이와 유사한 것이 아닌 tty를 사용하여 스크립트를 실행해야 합니다.

관련 정보