Como usar corretamente $ _ dentro de um script tcsh originado de outro script tcsh?

3

Eu tento recuperar o resultado de $_ dentro de um script tcsh originado por outro script tcsh (vou me referir a eles respectivamente como o script interno e externo). Mas $_ não está definido com o valor esperado (sendo o último comando executado).

código externo:

#!/usr/bin/tcsh

set lastCmd0 = ($_)
echo "${lastCmd0}"
echo "$0"
source inner
echo "enOuter"

código interno:

#!/usr/bin/tcsh

set lastCmd1 = ($_)
echo "${lastCmd1}"
echo "$0"
echo "endInner"

Aqui está a saída ao chamar source outer :

source outer 
tcsh
source outer 
tcsh
endInner
enOuter

Q 1 Por que há dois source outer , o segundo não deve ser source inner ?

Aqui está a saída ao chamar ./outer :

./outer

./outer
endInner
enOuter

Q 2 Por que $_ não está definido quando a origem é interna?

Parece que $_ nunca é definido novamente ao executar um script, não sei se é normal ou não. De qualquer forma, se não for possível usar $_ , existe uma alternativa segura de obter o último comando executado dentro de um script?

    
por ahonorat 29.01.2016 / 00:06

1 resposta

1

tcsh pode atualizar os itens em argv() se você fornecer parâmetros para o comando source , mas não alterar $0 ou $_ .

Você pode ver o que está acontecendo alterando as mensagens para mostrar qual variável é impressa e qual script faz isso. Primeiro "exterior":

#!/usr/bin/tcsh

set lastCmd0 = ($_)
echo 'O:$lastCmd0'"=${lastCmd0}"
echo 'O:$0'"=$0"
source inner
echo 'O:endOuter'

e depois "interior"

#!/usr/bin/tcsh

set lastCmd1 = ($_)
echo 'I:$lastCmd1='"${lastCmd1}"
echo 'I:$0'"=$0"
echo 'I:endInner'

Saída:

> tcsh -f
> source ./outer
O:$lastCmd0=source ./outer 
O:$0=tcsh
I:$lastCmd1=source ./outer 
I:$0=tcsh
I:endInner
O:endOuter

e

> source ./outer first second
#argv: 2
O:$lastCmd0=source ./outer first second 
O:$0=tcsh
I:$lastCmd1=source ./outer first second 
I:$0=tcsh
I:endInner
O:endOuter
    
por 31.08.2016 / 01:52