tee
stdin에서 읽고 입력 스트림을 stdout과 파일로 분할하여 작동합니다.
프로세스의 표준 입력과 비슷한 작업을 수행하려고 합니다. 명령의 표준 입력이 여전히 tty 또는 의사 터미널에 연결되어 있고 파일과 같은 임의 소스로부터 입력을 받을 수도 있기를 원합니다.
다양한 파이프 트릭과 IO 리디렉션을 시도했지만 stdin을 터미널로 사용하는 프로그램에 필요한 시나리오를 복제할 수 없습니다.
불가능할 수도 있지만 물어보고 싶다고 생각했습니다.
답변1
select()
tty와 다른 소스를 호출하고 두 소스 모두에서 무엇이든 읽는 프로그램을 작성할 수 있습니다 . 그러나 다른 소스가 파일인 경우에는 의미가 없습니다. 입력을 기다리지 않고 항상 파일을 즉시 읽을 수 있습니다. 따라서 결과는 파일을 먼저 처리한 다음 tty 입력을 처리하거나 그 반대로 처리하는 것입니다. (파일이 매우 커서 실제로 측정 가능한 시간 동안 디스크를 기다려야 하는 경우는 제외됩니다.)
파일을 먼저 읽은 다음 tty 입력/stdin을 읽으려면 cat file -
.
답변2
귀하의 시나리오에 파일이 어떻게 관련되어 있는지 잘 모르겠습니다. 파이핑 stdin이 임시 파일을 읽거나 메모리에 저장한 다음 다음과 같은 방법을 통해 tty 액세스를 복원할 수 있습니다.
#!/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
나는 이 방법을 사용한다feed
REPL의 표준 입력그런 다음 이 REPL을 대화형 사용으로 변환합니다.
$ echo '(print "hello")' | feed - sbcl --noinform
* (print "hello")
"hello"
"hello"
* (quit)
(quit)
$