![단일 파일 설명자에 대한 읽기 및 쓰기를 다른 위치로 보내는 방법은 무엇입니까?](https://linux55.com/image/40697/%EB%8B%A8%EC%9D%BC%20%ED%8C%8C%EC%9D%BC%20%EC%84%A4%EB%AA%85%EC%9E%90%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%9D%BD%EA%B8%B0%20%EB%B0%8F%20%EC%93%B0%EA%B8%B0%EB%A5%BC%20%EB%8B%A4%EB%A5%B8%20%EC%9C%84%EC%B9%98%EB%A1%9C%20%EB%B3%B4%EB%82%B4%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
.)