você pode esperar que o comando cat fout
termine como:
#!/bin/bash
shift;
cat fout &
foutid=$!
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin <&0 &
wait $foutid
sleep 2
kill %%
exit
Estou tentando usar o rsync em um shell personalizado criado com o fifo. No entanto, não consigo encontrar uma maneira de lidar com isso:
O script initsh
para simular um shell padrão pelo fifo:
#!/bin/bash
rm fin
mkfifo fin
rm fout
mkfifo fout
rm ferr
mkfifo ferr
rm farg
mkfifo farg
read arg <farg
cat fin | /bin/bash -i -c "$arg" 1>fout 2>ferr
Este script funciona bem, você pode testá-lo executando (cat fout &) && echo ls > farg
O script rsh
para passar para o rsync:
#!/bin/bash
shift;
cat fout &
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin
sleep 2
kill %%
exit
A maneira de chamar o rsync com:
rsync -e './rsh' user@fakehost:/
Funciona bem quando você executa echo ./rsh
, você tem o shell como o rsync espera.
Mas quando o rsync o executa, ele não fecha stdin e, portanto, aguarda a parada (o EOF) de "cat | ...". Eu também tentei com exec 0<>fin
, mas não funciona de todo.
Existe algum truque para fechar o identificador corretamente? Ou você tem alguma outra abordagem?