Com socat
(versão 2 ou superior):
socat 'system:cat input.txt & cat > output.txt,commtype=socketpair' \
'system:foo,nofork'
Ou melhor ainda:
socat 'CREATE:output.txt%OPEN:input.txt' 'system:foo,commtype=socketpair'
Estamos usando um socketpair
que é bidirecional (os pipes não são bidirecionais no Linux). Outra opção é usar um pseudo-terminal (bidirecional também) usando commtype=pty
acima. Essa pode ser uma maneira melhor se foo
espera falar com um terminal.
Ou você implementa a abordagem socketpair
em perl
como:
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"'
(aqui como uma rápida prova de conceito, você pode querer adicionar a verificação de erros e torná-la mais eficiente, não usando muitos processos e evitando a execução de cat
).