Significado de \ antes da variável de ambiente

2

Em ksh em uma caixa antiga do Solaris, usei:

export PS1="$PWD $"

para definir o prompt para o diretório atual. Funciona muito bem até você gravar em outro lugar, então você vê que não está avaliando o PWD a cada vez. Eu notei que é fixo, em vez disso, definir PS1 assim:

export PS1="\$PWD $"

Apenas curiosidade sobre o que é chamado, como funciona, outros aplicativos, etc. (É uma dessas coisas bastante resistentes ao Googling.)

    
por Gilles 16.10.2014 / 18:28

2 respostas

9

Alguns documentos ajudarão a explicar isso.

Do documento de padrões POSIX para o shell :

The following variables shall affect the execution of the shell:
PS1: Each time an interactive shell is ready to read a command, the value of this variable shall be subjected to parameter expansion and written to standard error.
...
Single-Quotes
Enclosing characters in single-quotes shall preserve the literal value of each character within the single-quotes.
...
Double-Quotes
Enclosing characters in double-quotes shall preserve the literal value of all characters within the double-quotes, with the exception of
$: The dollar sign shall retain its special meaning introducing parameter expansion
...
Escape Character (Backslash)
A backslash that is not quoted shall preserve the literal value of the following character.

Portanto, o valor de PS1 está sujeito à expansão de parâmetros, e é isso que você quer, então $PWD será avaliado toda vez que você receber uma solicitação. Isso significa que precisa haver uma string $PWD real no valor de PS1. Mas,

export PS1="$PWD $ "

colocará o valor de PWD no momento em que a instrução de exportação for executada no PS1. PS1 será algo como /home/poldie $ e nunca mudará depois disso. Você não quer isso.

export PS1="\$PWD $ "

A barra invertida irá citar o $ , de modo que PS1 contenha a string literal $PWD $ . Você quer isso.

export PS1='$PWD $ '

fará o mesmo. Os parâmetros não são expandidos quando estão entre aspas simples.

    
por 16.10.2014 / 18:59
3

O caractere \ escapa do caractere (especial) a seguir. Nesse caso, ele escapa do $ , que normalmente usamos para excluir a referência de uma variável. Quando o shell avalia uma atribuição de variável, ele primeiro expande o lado direito da expressão. Sem o \ antes de $PWD , o shell expande $PWD e atribui o resultado a PS1 .

No entanto, com o \ , o shell trata $PWD como uma string literal e atribui-o como é a PS1 , de modo que PS1 contenha a string $PWD e não o valor expandido da variável $PWD . Quando o shell está prestes a exibir o prompt, ele mais uma vez realiza expansão de variável e, desta vez, porque $PS1 contém $PWD , sem o \ , o shell expande com êxito o diretório atual.

A mesma abordagem pode ser usada para criar nomes de variáveis dinâmicas em shell scripts (o sistema NetBSD rcNG usa isso amplamente, especialmente em scripts controlando interfaces de rede, onde o número de designações de adaptador de rede no NetBSD e no FreeBSD torna isso impraticável codificar explicitamente para cada um).

    
por 16.10.2014 / 18:48