[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/
- Re:_[shell-script]_conteudo_da_linha_em_execução,
moysespr <=