shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Acho que eh eval


From: Felipe Kellermann
Subject: Re: [shell-script] Acho que eh eval
Date: Thu, 28 Apr 2005 00:25:19 -0300 (BRT)
User-agent: Pine <http://www.washington.edu/pine/>

On Wed, 27 Apr 2005 2:01pm  -0300, Julio Cezar Neves - DATAPREVRJ wrote:

> Felipe, se vc tiver com tempo, faca um benchmark com as 2 solucoes. Apesar

Vejo que tu tem usado (e, portanto, incentivado) algumas funcionalidades
especificas de alguns shells (no teu caso, bash) para solucionar alguns
problemas. Acho legal isso. Lembro quando falamos sobre subprocessos em
uma ligacao que tu me fez...

Mas essas funcionalidades servem quase que exclusivamente para um unico
proposito: Poupar tempo, e isso nao significa "processamento".

Qual seria mais rapido?

$ date > data_1 > data_2

Ou

$ date | tee data_1 > data_2

Eu responderia: Depende.
Mais rapido (e sexy) para digitar e usar, ou mais rapido para o
processamento? Depende... Vamos ver:


> de estar fazendo fork (2 e nao 4, pq o xargs resolve tudo em uma so passada
> (se o arq.txt nao for enorme), para que ele pegasse registro a registro
> teria de usar as opcoes -n1 ou -l1), estou tratando todo o arquivo
> (provavelmente) de uma so vez gracas ao xargs. 

Tu disse:
"Prompt> grep -f <(cat Relatorio_de_nomes_incompleto.txt |
 xargs  -i echo ^{}) <(ls --color=none)"

Conta comigo: 1) grep, 2) cat, 3) xargs, 4) echo, 5) ls.

OK, sem problemas sobre este numero. Os sistemas operacionais sabem como 
fazer esse negocio direito e de forma otimizada.

Sobre repetir o `echo': Julio, por favor, testa o teu "exemplo"... :-)

Em uma conversa que tivemos ha bastante tempo eu expliquei o motivo de 
isso nao funcionar. Para 1024 entradas em para o xargs, tu vai ter ele 
executando 1024 vezes os argumentos dele.

Vai repetir: Sob "modificacoes" no elemento do xargs, ele nao pode tentar 
juntar tudo em um (ou, tentar otimizar) o exec. Ha motivos simples. Veja 
comigo: Vamos imaginar um "Relatorio_de_nomes_incompleto.txt" assim:

Joana
Banan
Julio

Como ficaria o resultado?

Nao ficaria assim: "^Joana Banan Julio"? Como o grep poderia usar esse 
arquivo do subprocesso para (ufa!) comparar com a lista do subprocesso 
usado para a listagem dos arquivos?

Nao concorda comigo que, para N entradas para `xargs', daquele modo que tu 
usou ele, ele vai fazer N execs com os argumentos dele? Acho que inclusive 
nos ja falamos sobre isso...


> Evito o qto posso usar o while que le registro-a-registro e ambos sabemos
> que o tempo de I/O e enorme comparado a um fork (que e processado em
> memoria, somente duplicando as variaveis exportadas e as de controle da
> pilha de codigo (stack code)).

Nada vai ser lido "registro-a-registro", as coisas nao funcionam assim.

E esse "fork" depende. No teu caso (do xargs) nao vai ser apenas um 
simples fork. Vai ser um combo de fork + exec e alguns outros.

Dica: E cada um desses `exec' vai gerar um I/O incrivelmente maior do que 
aquela leitura (unica) do arquivo de dados, que tambem vai precisar ser 
lido no caso do teu `cat' e passado via um pipe para o `xargs'.


> Essa e uma bela saida, pena que cada shell tem uma implementacao distinta do
> glob.

A implementacao do glob de um shell nao tem nada a ver com a implementacao 
de um glob(3), que um sistema POSIX precisa suportar. Mesmo assim...

OBS: Tu sabe que eu gosto de subprocessos. Assim como gosto de coprocessos 
e tantas outras coisas. Mas nem sempre essas sao as solucoes mais simples 
e intuitivas, na minha opiniao.

-- 
Felipe Kellermann


reply via email to

[Prev in Thread] Current Thread [Next in Thread]