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

3

Até agora, eu 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, o qual conecta seu stdout com o display ou um arquivo.

Seria possível, entretanto, fazer um loop de comandos, então o stdout do último comando se conecta ao stdin do primeiro comando e talvez usando tee de alguma maneira os valores de mudança de uma certa saída poderiam ser exibidos?

    
por sharkant 27.05.2017 / 22:06

3 respostas

0

Bem, você certamente poderia apenas 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 começo novamente

    
por 27.05.2017 / 22:28
7

Não tenho certeza sobre todos os shells que existem, mas no Bash é possível, embora não com pipes não nomeados. 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 oleoduto:

echo x >fifo

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

cat fifo

A saída aparecerá uma vez:

x

Para tornar isso um pouco sofisticado, o canal pode ser esse:

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

Por isso, irá adicionar um x à saída em cada iteração. Claro que sim, mas apenas uma vez iniciadas as iterações, ou seja, logo que o cano desbloqueia, é assim que há algo para ler. Como anteriormente, isso pode ser iniciado manualmente:

echo x >fifo

Agora, veja o que top mostra. Deve haver muita atividade de cat e xargs .

E o mesmo de antes, se você drenar o pipeline, você verá muito x s no terminal, e o pipeline irá bloquear.

Seria uma pergunta válida, por que o pipeline é drenado. Por que o comando cat está comprometido no terminal, deixando nada no circuito. Eu não sei disso.

    
por 27.05.2017 / 22:51
2

Não, isso não é possível. Pelo menos não sem algum truque de descritor de arquivo sério, ou um loop como ADDB está mostrando em sua resposta .

Não há problemas reais reais suficientes para garantir a implementação da sintaxe para um pipeline circular de alimentação automática, e posso ver problemas em determinar quando o pipeline seria considerado "concluído", qual seria seu status de saída e como para garantir que não esteja bloqueando.

O único tipo de aplicações em que posso pensar no momento está no campo da análise numérica, ou em alguns outros campos computacionais, onde uma solução numérica é refinada usando um método iterativo até que uma estimativa de erro é reduzida abaixo de um certo ponto .

Esses tipos de problemas requerem aritmética de ponto flutuante (geralmente com alta precisão), o que não é suportado pela maioria dos shells. Esses problemas geralmente também exigem um ambiente de execução mais rápido do que o que um shell fornece.

    
por 27.05.2017 / 22:49