표준 입력이 리디렉션될 때 입력을 요청할 때 작동하도록 스크립트를 얻으려고 합니다. 불가능할 수도 있지만 그 이유를 알고 싶습니다. 예는 다음과 같습니다.
$ 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를 사용하여 스크립트를 실행해야 합니다.