O que $ _ e $ 0 representam no bash de origem? [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    
  •              Compreenda o significado de '$ _'                                      2 respostas                          
  •     

Estou tendo problemas para entender as variáveis {_, 0} no exemplo a seguir.

No script tmp.sh :

func() 
{
echo $_
echo $0
echo $1
}

chamando tmp.sh com o parâmetro x:

~$ ./tmp.sh x
./tmp.sh
./tmp.sh
x

e tmp.sh originado com o parâmetro x:

~$ . ./tmp.sh x
x
bash
x

Pelo que entendi, $_ e $0 , o último é para o primeiro argumento, como no primeiro exemplo é ./tmp.sh . Por que é equivalente a bash no segundo exemplo?

O que . expande para e o primeiro, sobre o qual não tenho certeza, retorna o último parâmetro com o bash de origem e é equivalente a $ 0 no bash sem recursos. É esse o caso?

    
por Error 17.11.2017 / 05:24

2 respostas

0

De seção especial do man page do bash :

   0      Expands to the name of the shell or shell script.  This is set at shell initialization.  If bash is invoked with a file of commands, $0 is set to  the
          name  of  that  file.  If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present.
          Otherwise, it is set to the filename used to invoke bash, as given by argument zero.

Basicamente, $0 fornecerá o nome do script ao executar um script ou bash se o modo interativo. Observe que . , que é um alias para source , não é um executável, mas um shell integrado, portanto, não altera o valor de $ 0 e mantém o bash no modo interativo.

   _      At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument  list.
          Subsequently,  expands  to the last argument to the previous command, after expansion.  Also set to the full pathname used to invoke each command exe‐
          cuted and placed in the environment exported to that command.  When checking mail, this parameter holds the name of  the  mail  file  currently  being
          checked.
    
por 17.11.2017 / 05:37
1

Variáveis referenciadas por $N onde N é um número são os parâmetros posicionais para o seu script. $0 é o primeiro parâmetro, que é o próprio script. $1 é o segundo parâmetro (referenciado como 1 porque bash está contando a partir de zero, e os humanos começam em 1), que é x.

$_ é um pouco mais estranho, porque não é especificamente um parâmetro posicional, mas é um parâmetro especial que começa como o caminho completo para o comando que está sendo executado, mas subseqüentemente torna-se o valor do último argumento para o comando anterior, após qualquer expansão. É por isso que é o mesmo que $0 em sua primeira execução e, no segundo em que você está adquirindo o script, ele está se expandindo para o valor x (que é o último argumento do comando anterior interpretado pela origem).

Para mais informações sobre isso, comece a ler o manual bash em Seção 3.4.1: Parâmetros posicionais

A próxima seção, 3.4.2, contém informações sobre as variáveis especiais, incluindo $_ .

    
por 17.11.2017 / 05:37

Tags