Por que a saída de _ $ _ quando executada em um terminal?

4

Eu executei a seguinte sequência de comandos:

$ now=$(date)
$ echo _$now_
_
$ echo _ $now _
_ Mon Sep 22 09:53:44 IST 2014 _

Por que a saída de _$now_ only _ ?

    
por Tripti Singh 22.09.2014 / 09:13

4 respostas

11

Em man bash :

DEFINITIONS
       The following definitions are used throughout the rest of this document.
       blank  A space or tab.
       word   A sequence of characters considered as a single unit by the shell.
              Also known as a token.
       name   A word consisting only of alphanumeric characters and underscores, 
              and beginning with an alphabetic character or an underscore.  Also 
              referred to as an identifier.
...
PARAMETERS
       A parameter is an entity that stores values.  It can be a name, a number, 
       or one of the special characters listed below under Special Parameters.  
       A variable is a parameter denoted by a name.

Uma variável só pode ter alfabetos, números e sublinhados. E assim, now_ é um nome de variável válido e é interpretado como tal.

Você pode delimitar o nome da variável de maneiras diferentes:

_"$now"_
_${now}_
_$now"_"
_$now'_'

Ou qualquer combinação dos itens acima.

    
por muru 22.09.2014 / 09:19
10

porque _ faz parte do nome da variável em echo _$now_

use echo \_$now\_ .

Além disso, você pode usar isso apenas em um comando linear: echo _$(date)_

    
por αғsнιη 22.09.2014 / 09:16
7

Carregue comigo por um momento, isso requer um pouco de explicação.

Primeiro, por que a saída de _ $(date) _ é _ Mon Sep 22 03:30:34 MDT 2014 _ ? Porque isso literalmente diz ao echo output _ primeiro depois output $ (date) then _. Espaços separam as variáveis para o eco.

Agora, tente echo _$(date) , sem espaço entre _ e $(date) . Nesse caso, a saída será _Mon Sep 22 03:32:40 MDT 2014 . O que isso faz? você diz echo para concatenar underscore com saída de $(date) .

Tente a mesma coisa com _$PWD , que concatenará seu diretório de trabalho com sublinhado. Agora tente echo $PWD_ . A saída ficará em branco. Por quê? porque PWD_ é uma variável de ambiente inexistente e, como outros mencionaram _ , é um caracter válido para uma variável de ambiente, por ex. $XDG_CURRENT_DESKTOP .

Então, por que _$PWD_ daria _ ? Porque você está dizendo echo para concatenar _ com a saída da variável de ambiente inexistente. Portanto, _ é impresso, mas $PWD_ output está em branco, portanto, você vê literalmente _ concatenado com essa saída em branco.

    
por Sergiy Kolodyazhnyy 22.09.2014 / 09:35
1
_$now_ 

é interpretado como

_${now_}

que é, no seu caso, obviamente a string concat de '_' e ''. Use, portanto,

_${now}_

em vez disso. É muito mais claro ler.

    
por Stefan Friedrich 23.09.2014 / 08:29