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

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

Re:_[shell-script]_conteudo_da_linha_em_execu��o


From: moysespr
Subject: Re:_[shell-script]_conteudo_da_linha_em_execução
Date: Tue, 2 Dec 2003 19:55:07 -0800 (PST)

Nenhum mistério, a função F apenas conclui com status 0 se o nome da função
seguinte a ela, na linha de chamada, estiver em uma lista. Ou melhor, ei-la:
function F { echo "$funcs"|grep " `sed --silent $1p \
/sh/funcs|cut -d\& -f 3-|cut -d\( -f 1` ">/dev/null
}

A única finalidade da função é checar a lista e retornar 0 ou !0 .

O LINENO é apenas para o sed mostar  o conteúdo da linha do script onde a F foi
chamada, para resgatar o nome da função seguinte na linha.

Será que em tuas palavras "...usando um eval com a substituição :=. Na F tu vai
ter a linha da chamada. ..", está a solução, que não percebi?

O exemplo com read lê o arquivo do início até a linha de chamada, para cada
chamada. Algo parecido com o que o sed deve fazer e que eu gostaria de evitar.
Posso estar errado, mas tenho a impressão que o read é uma das mais lentas
soluções de leitura de linha.

No meu script tenho um esboço usando o eval com uma variável F (também). Daí a
função F apenas checa se $F está na tal lista. Abaixo, exemplo com uma função
de nome "nao" e a função F para este modelo de solução. Já faz algum tempo que
testei, está comentado no script, mas parece-me que funcionou:
-----
F(){
 echo "sim nao"|grep $F>/dev/null
}
F=nao #Teste de função nao
F&&eval "$F(){
echo "nao"
}"
------
Os delimitadores que comentei são, aqui, as aspas, após o eval e após o
fechamento da chave. Não é uma calamidade, é só lembrar sempre que é necessário
colocar.

Se não aparecer a solução sonhada, provavelmente vou definir, no relógio, entre
esta solução e a anterior. Tenho convicção que esta última deverá vencer por
uma diferença importante em scripts com dezenas de chamadas de F. Esclarecendo
bem, quero o nome da função à direita ( "nao") escrita uma única vez :) , por
isso é que ficou complicado. :(  Em condição normal a lista vem de fora, é
parâmetro do script.

Obrigado pela atenção dispensada à minha questão.


--- Felipe Kellermann <address@hidden> wrote:
> 
> On Sun, 30 Nov 2003 5:28pm  -0800, moysespr wrote:
> 
> > Detalhando mais a situação atual.
> >
> 
>       Seria possível falar qual é o mistério da F(), também? :-)
> 
> > 1. Hoje realmente eu uso o sed (248kB) na função F para ter a linha do
> script
> > cujo número passo como parâmetro. São muitas linhas de chamada ao longo do
> > script.
> 
>       E o que a F() faz depois de pegar a linha?
> 
> > 2. A opção com a linha de comando em variável está como outra alternativa.
> Deve
> > ser rápida, mas exige alguns caracteres delimitadores adicionais, que
> gostaria
> > de evitar.
> 
>       Não entendi bem. Quais caracteres delimitadores? Pode fazer o que
> mostrei usando um eval com a substituição :=. Na F tu vai ter a linha da
> chamada. Ou precisaria ser o número da linha por algum motivo? Poderia ser
> por motivos de "debug" que estamos usando a LINENO. É isto?
> 
>       Eu também acho que isto deve ser feito "apenas na shell", mas eu
> recomendaria não ir muito nestas histórias de "não carregar um programa
> várias vezes". Se tu tá usando algum sistema moderno, ele deve saber muito
> bem quando deve fazer alguma troca ou não. Antes se usava o sticky bit
> para isto, não é? Pois, uma forma "só shell" que eu recomendaria é esta,
> 
> $ cat rl
> #!/bin/sh
> F() { for ((i=1; i <= $1; i++)) do read l; done < $0 && echo l: $l; }
> F $LINENO # comentário
> $ rl
> l: F $LINENO # comentário
> 
>       Funcionaria bem também se fosse relativo às funções. Só ler a
> partir dela até a chamada. Uma outra forma que pode ser legal é carregar
> uma única vez todo o programa e depois apenas usar as linhas como o
> índice. Um pouco diferente, tudo depende do misterioso objetivo da F();
> 
>       Até mais, :-)
> 
> -- 
> Felipe Kellermann
> 


__________________________________
Do you Yahoo!?
Free Pop-Up Blocker - Get it now
http://companion.yahoo.com/


reply via email to

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