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

[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



reply via email to

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