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 top
mostra. Deve haver muita atividade de ambos cat
e xargs
.
E da mesma forma que antes, se você drenar o pipeline, deverá ver muitos x
s no terminal e o pipeline será bloqueado.
Seria uma pergunta válida: por que o gasoduto é drenado? Por que o cat
comando é 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.