Saída do comando Pipe para entrada do comando running / backgrounded

4

No Bash 4.X É possível fazer algo como:

command that expects input &
echo some output | %1

Onde% 1 representa o primeiro comando em segundo plano?

    
por Gregg Leventhal 18.07.2013 / 20:24

3 respostas

3

Depois de começar:

rm -i -- * &

rm foi iniciado com o stdin em seu shell no momento em que você chamou esse comando.

Se fosse o terminal, então rm normalmente seria suspenso (com o sinal SIGTTIN) assim que tentasse ler a partir dele (já que não está no grupo de processos de primeiro plano do terminal).

Se você quiser ler de outra coisa, você tem que dizer para reabrir o descritor de arquivo 0 em outra coisa.

Você poderia fazer isso com um depurador (assumindo aqui que está no Linux):

rm_pid=$!
coproc yes
gdb --pid="$rm_pid" --batch \
    -ex "call close(0)" \
    -ex "call open(\"/proc/$$/fd/$COPROC\", 0)" /bin/rm
kill -s CONT "$rm_pid"

Acima, estamos começando yes em segundo plano com stdin e stdout redirecionados para um canal. A outra extremidade desse pipe está no shell (processo $$ ) no descritor de arquivo ${COPROC[0]} aka $COPROC .

Depois, com gdb , estamos dizendo rm para fechar seu fd 0 e reabri-lo no mesmo canal.

    
por 18.07.2013 / 22:47
5

Sim, mas você precisa de um pouco mais.

Quando você envia um programa para o segundo plano, você o desanexou de stdin associado ao seu terminal. Você precisa iniciá-lo com uma entrada alternativa, neste caso, um pipe.

$ mkfifo alternate_input
$ command_that_expects_input < alternate_input

Agora você atribuiu o arquivo de pipe ( alternate_input ) como stdin para o processo command_that_expects_input . Para enviar dados, basta colocar algo no tubo.

$ echo foo > alternate_input

Neste caso, a string foo torna-se transferida para stdin para command_that_expects_input .

    
por 19.07.2013 / 00:01
1

A maneira como você postula, não. Como Terdon diz, é muito mais fácil se você sabe que precisa canalizar a entrada em primeiro lugar. No caso raro (tão raro que nunca o encontrei) em que um programa não espera nenhuma entrada agora, mas espera entrada no futuro, você pode configurar um canal nomeado como a entrada para esse processo, fazer o plano de fundo e enviar saída de um processo iniciado posteriormente para o mesmo pipe nomeado, mas você precisa configurar o pipe nomeado antecipadamente.

    
por 18.07.2013 / 20:46