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: Felipe Kellermann
Subject: Re:_[shell-script]_conteudo_da_linha_em_execução
Date: Thu, 4 Dec 2003 00:24:48 -0200 (BRST)

On Tue, 2 Dec 2003 7:55pm  -0800, moysespr wrote:

> 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
> }

        Mas "executa" a próxima ou só verifica se está na função?


> 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?

        No exemplo seguinte, vou usar isto.


> 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.

        Estranho teu exemplo. O que entendi da tua descrição, seria isto:

$ cat rl3
#!/bin/sh
f() { echo e a nossa próxima função, $FUNCNAME; }
F() { set $f && echo função F/$*/, próxima/$3/ && grep -q $3 /sh/f; }
eval ${f:=F && f} # se acha feio, faz um "wrapper", ex: executa (...)

        A "linha" fica apenas sendo a parte "F && f". Era isto?
        A F() tem a linha inteira e verifica a segunda chamada em uma
lista, se esta chamada está na lista (retornando 0 do grep), então a
próxima função da chamada inicial é executada, é isto? Fica assim:

$ rl3
função F/F && f/, próxima/f/

        Então a próxima (f, na chamada) não está na lista (/sh/f).
        Vamos colocar ela na lista e tentar "chamá-la" outra vez:

$ echo f > /sh/f && rl3
função F/F && f/, próxima/f/
e a nossa próxima função, f

        Foi o que consegui entender. Seria mais ou menos isto?
        E teria algum problema em usar a history? Por exemplo:

$ cat rl4
#!/bin/sh
f() { echo blaa; }
F() { history 1; }
set -o history
F && f
$ rl4
    1  F && f
blaa

-- 
Felipe Kellermann


reply via email to

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