foo
fd 0에서 입력을 읽고 출력을 fd 0에 쓰는 Linux 실행 파일이 있습니다 (아니요FD1). 이는 터미널에서 대화형으로 사용하는 데 적합합니다.
쉘 명령줄에서 한 파일에서 fd 0을 읽고 다른 파일에는 fd 0을 쓰도록 이 프로그램을 어떻게 실행합니까?
내가 생각할 수 있는 가장 좋은 것은 $ goo input.txt output.txt | foo
어딘가에 도우미가 goo
있는 것인데 기존 도우미가 있는지도 모르고 설정 중인 파이프가 양방향인지도 모르겠습니다 |
.
답변1
사용 socat
(버전 2 이상):
socat 'system:cat input.txt & cat > output.txt,commtype=socketpair' \
'system:foo,nofork'
또는 더 나은 방법은 다음과 같습니다.
socat 'CREATE:output.txt%OPEN:input.txt' 'system:foo,commtype=socketpair'
우리는 양방향을 사용하고 있습니다 socketpair
(Linux의 파이프는 양방향이 아닙니다). 또 다른 옵션은 위의 방법을 통해 의사 터미널(양방향)을 사용하는 것입니다 commtype=pty
. 터미널과 통신하려는 경우 foo
이 방법이 더 나은 방법일 수 있습니다 .
또는 다음과 같은 socketpair
방법을 구현할 수 있습니다 perl
.
perl -MSocket -e '
socketpair(A, B, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
if (fork) {
close A;
if (fork) {
open STDOUT, ">&B";
exec("cat", "input.txt")
}
open STDIN, "<&B";
open STDOUT, ">output.txt";
exec("cat")
}
close B;
open STDIN, "<&A";
exec "foo"'
(여기서 빠른 개념 증명으로 오류 검사를 추가하고 많은 프로세스를 사용하지 않고 실행을 방지하여 더 효율적으로 만들 수 있습니다 cat
.)