É possível construir um loop de comandos com pipe ou outra coisa?

É possível construir um loop de comandos com pipe ou outra coisa?

Até agora, conheço o mecanismo de tubulação como uma forma de conectar uma série de comandos conectando o stdout de um comando ao stdin do próximo comando até que o último comando seja alcançado, que conecta seu stdout ao display ou a um arquivo.

Seria possível, no entanto, fazer um loop de comandos, de modo que o stdout do último comando se conectasse ao stdin do primeiro comando e talvez usando tee de alguma forma os valores alterados de uma determinada saída pudessem ser exibidos?

Responder1

Não tenho certeza sobre todos os shells que existem, mas no Bash é possível, embora não com pipes sem nome. Portanto, não com o |símbolo. Mas se você criar um pipe nomeado:

mkfifo fifo

Então você pode usá-lo:

<fifo cat | cat >fifo &

Agora o pipeline funciona em segundo plano, mas não faz nada. Mas se você alimentar o tubo de fora do pipeline:

echo x >fifo

O pipeline será desbloqueado e continuará para sempre. Ou até drenar o cano:

cat fifo

A saída aparecerá uma vez:

x

Para tornar isso um pouco sofisticado, o pipeline pode ser este:

<fifo cat | xargs -I@ echo @x >fifo &

Portanto, ele adicionará um xà saída a cada iteração. Claro que sim, mas apenas quando as iterações começarem, ou seja, assim que o tubo for desbloqueado, ou seja, assim que houver algo para ler. Como anteriormente, isso pode ser iniciado manualmente:

echo x >fifo

E agora dê uma olhada no que topmostra. Deve haver muita atividade de ambos cate xargs.

E da mesma forma que antes, se você drenar o pipeline, deverá ver muitos xs no terminal e o pipeline será bloqueado.

Seria uma pergunta válida: por que o gasoduto é drenado? Por que o catcomando é confirmado no terminal não deixando nada no circuito. Eu não sei disso.

Responder2

Bem, você certamente poderia simplesmente fazer um loop e usar variáveis:

while true; do
    a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done

Isso salvaria a última saída que seria usada no início novamente

Responder3

Como resposta existente, o pipeline em loop não é possível no shell Unix sem o uso de pipe nomeado (criado usandomkfifo(1)). Mas você pode fazer isso em C; por exemplo, aqui está o meuimplementação simples e suja, que nem esperou a saída dos processos.

Espero que você ache esta informação útil.

informação relacionada