Como obter a saída de forma completa [RESOLVIDO]

1. Como obter a saída de forma completa [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 06/01/2010 - 21:01h

Gostaria de saber se é possível obter a saída de forma completa de um conjunto de comandos.

Vamos supor:

for i aaa bbb ccc ddd; do echo $i ; sleep 5 ; done | sed 's/^/xxxx-/'

A saída será:
xxxx-aaa
(5 segundos depois)
xxxx-bbb
(5 segundos depois)
etc

Como se pode ver: cada comando echo assim que é executado, já envia sua saída para o sed.

O que quero dizer é o seguinte: Se tem uma forma de todos os comandos echo dentro do loop
serem executados de uma só vez e depois que todos forem executados, a saída toda é
enviada para o sed.

Utilizando arquivos temporários ou gravando a saída em uma variável auxiliar, eu consigo o
que quero. Só quero saber se tem outro jeito de fazer essa mesma tarefa.

O problema que já tentei quase tudo: subshells, /dev/fd/0, <(), etc e até agora nada. :(

Abraços


  


2. MELHOR RESPOSTA

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 07/01/2010 - 09:29h

Cara, também não conheço não, pois a sua variável possui UM valor por vez, logo, o máximo que conseguiria é fazer o sed só do último valor ... para fazer de todos juntos ... você teria que juntá-los ou em uma variável ou em um arquivo, como você falou.
Pelo menos é o que eu acho!

3. for

André Gustavo Neves Lopes
andrelopes.mrx

(usa FreeBSD)

Enviado em 06/01/2010 - 21:07h

Eu ia sugerir que você concatenasse todos os itens do for numa variavel, e depois enviasse pro sed, mas você já disse que isso não é o que você quer.

Então, infelizmente, do jeito que você quer fazer, não da, o for é pra isso mesmo, executar N comandos PARA CADA, item do loop.

André Gustavo
blog: http://blog.mrx.com.br
gtalk: andre@mrx.com.br


4. C a b u l o s o

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 07/01/2010 - 15:54h

Difícil, mas estou começando a entender...
Parece que, de toda maneira a saída é enviada de forma completa, apesar que cada comando
esteja sendo executado em separado.

O exemplo que dei não foi um dos melhores, porque cada saída do echo gera uma nova linha
que acaba sendo executada individualmente pelo sed, sendo a saída enviada de uma vez,
ou por partes.

Se a saída fosse enviada por partes, o seguinte teste iria falhar:

$for i in aaa bbb ccc ddd; do echo -n "$i:" ; sleep 5 ; done | sed 's/bbb:ccc/VAI TROCAR/'
aaa:VAI TROCAR:ddd

Ao fazer a pergunta, eu pensei que primeiramente o 'aaa:' iria para o sed, depois o 'bbb:' e logo
depois o 'ccc:'. Entretanto o que ocorre é que a saída dentro do bloco é enviada por completo (embora
não pareça, e era isso que estava me confundindo)

Acho que viajei demais (e continuo viajando). Darei o tópico como resolvido mas quem quiser
acrescentar algo, fique a vontade.

Agradeço a andrelopes.mrx e fdmarp pelas respostas.

Abraços




5. Re: Como obter a saída de forma completa [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 07/01/2010 - 20:59h

Creio que vc está um pouco perdido...

Quando vc faz:

for i in a b c
do
echo $i
done| sed 's/^/xxxx/'

O echo coloca o caracter '\n '(nova linha,fim de linha, como preferir chamar); o sed lê linha a linha os arquivos, ou seja, neste caso vc envia 3 linhas para o sed pois ele receberá 'a\n' 'b\n' 'c\n'; no outro caso:

for i in a b c
do
echo -n $i
done|sed 's/^/xxxx/'

Vc mandou o echo omitir o '\n', ou seja, vc manda uma linha para o sed; mas isso não quer dizer que o foi tudo de uma vez para o sed, mas sim que foi aos poucos, mas o sed não encontrou o '\n'; então ele age como se recebesse uma única linha.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts