[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RES: [shell-script] lance estranho
From: |
Rodolfo Villanova |
Subject: |
RES: [shell-script] lance estranho |
Date: |
Thu, 20 Mar 2003 12:01:35 -0300 |
Parabéns pela excelente explicação, amigo José.
Realmente foste preciso.
Agradeço a atenção e a paciência com que sempre dispões para, didaticamente,
explicar-nos detalhes sobre questões do mundo Unix que às vezes nos passam
despercebidas.
Rodolfo
-----Mensagem original-----
De: Jose NIEVIADONSKI [mailto:address@hidden]
Enviada em: quinta-feira, 20 de março de 2003 11:39
Para: address@hidden
Assunto: Re: RES: [shell-script] lance estranho
Pessoal da lista.
Vou dar mais uns pitacos.
no comando abaixo acontece o seguinte
(rm -f lixo ; sed 's/^/---/' > lixo) < lixo
1. Com os parênteses é criado um novo processo shell no UNIX (bash, ksh,
sh, etc.)
Esse processo shell tem a sua entrada padrão redirecionada para o
arquivo lixo.
Para isso deve-se abrir o arquivo e assinala-lo para a entrada padrão.
Resumindo a fase 1
Existe um processo UNIX que possui um arquivo aberto 'lixo'.
2. No sistema operacional UNIX se você abrir um arquivo e remover o mesmo
do diretório, por qualquer motivo ou meio, a área de dados do mesmo será
preservada até que o processo que mantém esse arquivo aberto termine.
Portanto o processo shell, iniciado com os parênteses irá manter os dados
originais do arquivo 'lixo'.
3. O primeiro comando do sub-shell é a remoção do arquivo. Por que?
O comando remove a entrada existente no diretório. Assim os dados do
arquivo não são mais acessados pelo seu nome, mas ainda não foram liberados
pois o processo sub-shell o mantém aberto.
4. O próximo comando sed irá iniciar um outro processo. Para isso o shell
deve criar e abrir o arquivo 'lixo' !!!! Mas como isso não "queima" os
dados originais??? Simples. Lembrem que não existe mais a entrada do nome
'lixo' no diretório pois foi removida pelo comando rm anterior. Portanto, o
shell, não encontrando o arquivo no diretório irá criar o arquivo 'lixo' de
novo no diretório e para isso USA OUTRO INODE (outra área de dados), não
mexendo na área de dados original, mantida pelo shell.
5. Criado e aberto o arquivo de saída, o sed irá aplicar os seus comandos
lendo da entrada padrão(que nesse caso está redirecionada para a área
original do 'lixo) e gravar o resultado da edição na saída padrão que está
redirecionada para o NOVO arquivo 'lixo (outro inode)
6. Finito, a magia aconteceu.
P.S. Isso não funcionou no cygwin, pois a "magia" acontece devido a
característica do grande, fantaático e maravilhoso sistema operacional UNIX
e não do shell. No windows (arghh!!) não existe essa característica de
manutenção de dados de arquivos abertos. Aí também está explicado o porquê
de funcionar no ksh, sh, bash... Na realidade o UNIX fez a magia!!!!!!!
Espero que tenham gostado da explicação
Abraços a todos da lista
José Augusto Martins Nieviadonski
Analista de Sistemas Consultor
HSBC Bank Brasil S.A. - Banco Múltiplo