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

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

Re: RES: [shell-script] lance estranho


From: Jose NIEVIADONSKI
Subject: Re: RES: [shell-script] lance estranho
Date: Thu, 20 Mar 2003 11:38:38 -0300

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
Treinamento de informática
Fone : 41 340-5378 - Fax : 41 340-5011

      Para: <address@hidden>
      cc:
      cco:  Jose NIEVIADONSKI/HBBR/HSBC
      Assunto:    RES: [shell-script] lance estranho
"Rodolfo Villanova" <address@hidden>

20/03/2003 10:23 AM
Favor responder a shell-script            <font size=-1></font>

Amigos,

Talvez o professor Julio Neves possa nos dar uma definição mais precisa
tecnicamente sobre essa aparente "magia negra", mas mesmo assim vou "pôr
minha pitada nesse caldeirão".

Numa explicação simplista, o princípio que rege o fato de ser possivel
modificar um arquivo mesmo que ele tenha sido aparentemente removido do
File
System é que o processo shell-pai mantém o vínculo com o arquivo pelo seu
identificador no sistema, mesmo que o nome do referido arquivo tenha sido
removido por um subshell.

Um exemplo clássico que ocorre diariamente nos servidores com que trabalho
diz respeito à política de remoção de arquivos inúteis do disco com o
objetivo de liberar espaço.
Enquanto os arquivos removidos possuirem pelo menos um processo atrelado ao
arquivo, o espaço ocupado por esse arquivo não será disponibilizado até que
o último processo ativo vinculado a esses arquivos encerre sua execução. E
se esses arquivos não forem liberados nunca, indefinidamente eles
continuarão a "inchar lá" no disco.

Por uma questão de ilustração, pode-se verificar se um arquivo está aberto
(vinculado a um processo ativo) utilizando-se o comando fuser <arquivo>.


Grato pela atenção,


Rodolfo Villanova
TmS Brasil


-----Mensagem original-----
De: Flavio Villalva Civatti [mailto:address@hidden]
Enviada em: quinta-feira, 20 de março de 2003 09:25
Para: address@hidden
Assunto: Re: [shell-script] lance estranho


On Wed, 19 Mar 2003, Ulysses Almeida wrote:

> On Wed, Mar 19, 2003 at 07:49:19PM -0300, aurelio wrote:

[...]

> > # (rm -f lixo ; sed 's/^/---/' > lixo) < lixo

[...]

> > sed fazendo edição "in-place" só usando redirecionamento e
> > magia negra :)
>
> WOW mesmo...
> se eu fizer algo do tipo comando > arq, ele nao cria/re-faz esse
> arquivo? intaum pq tenho que apagar ele antes? No que os parenteses
> influenciam?

Em tudo! A magia negra está neles...

> Realmente parece magia negra.....
>
> > no linux funcionou, no cygwin não.
> >
> > eu não manjo lhufas de kernel então não sei direito como isso
> > funciona, só tenho uma leve idéia, mas achei muito bacana.
>
> Mas isso tem mais a ver com o interpretador de comando do que com o
> kernel, nao? nesse caso seriam caracteristicas obscuras do bash, que
> podem ser enquadrados nos fenomenos da para-computacao!

Não é só do bash, testei com ksh e sh... funciona também!

O cara que mostrou isto (Björn) deu uma pequena explicação que o
Aurélio pode ter deixado passar despercebida:

"The method relies on the fact that a file is not unlinked as long as
it is being accessed"

Como os parenteses criam um subshell, acredito que o shell pai
mantenha uma imagem do arquivo que é usada como entrada para o sed até
que o subshell devolva o controle e o resultado... o arquivo alterado!




This E-mail confidential. It may also be legally privileged. If you are not the 
addressee you may not copy, forward, disclose or use any part of it. If you 
have received this message in error, please delete it and all copies from your 
system and notify the sender immediately by return E-mail.
Internet communications cannot be guaranteed to be timely, secure, error or 
virus-free. The sender does not accept liability for any errors or omissions.
 
Esta mensagem pode conter informação confidencial e/ou privilegiada. Se você 
não for o destinatário ou a pessoa autorizada a receber esta mensagem, não pode 
usar, copiar ou divulgar as informações nela contidas ou tomar qualquer ação 
baseada nessas informações. Se você recebeu esta mensagem por engano, por favor 
avise imediatamente o remetente, respondendo o e-mail e em seguida apague-o.
Comunicações pela Internet não podem ser garantidas quanto à segurança ou 
inexistência de erros, ou contendo vírus. O remetente por esta razão não aceita 
responsabilidade por qualquer erro ou omissão no contexto da mensagem 
decorrente da transmissão via Internet.



reply via email to

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