[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