Significado de \ antes da variável de ambiente

Significado de \ antes da variável de ambiente

No ksh em uma caixa antiga do Solaris eu usei:

export PS1="$PWD $"

para definir o prompt para o diretório atual. Funciona muito bem até você gravar em outro lugar e ver que ele não está avaliando o PWD todas as vezes. Percebo que isso foi corrigido configurando o PS1 assim:

export PS1="\$PWD $"

Só estou curioso para saber como é chamado, como funciona, outras aplicações, etc. (É uma daquelas coisas bastante resistentes à pesquisa no Google.)

Responder1

Algumas peças de documentação ajudarão a explicar isso.

DeDocumento de padrões POSIX para o shell:

As seguintes variáveis ​​afetarão a execução do shell:
PS1: Cada vez que um shell interativo estiver pronto para ler um comando, o valor desta variável deverá ser submetido à expansão de parâmetros e escrito no erro padrão.
...
Aspas simples
Os caracteres entre aspas simples devem preservar o valor literal de cada caractere entre aspas simples.
...
Aspas duplas
Os caracteres entre aspas duplas devem preservar o valor literal de todos os caracteres entre aspas duplas, com exceção de
$: O cifrão deve manter seu significado especial introduzindo a expansão do parâmetro
...
Caractere de escape (barra invertida )
Uma barra invertida que não esteja entre aspas preservará o valor literal do caractere seguinte.

Portanto, o valor de PS1está sujeito a expansão de parâmetros, e é isso que você deseja, para que $PWDseja avaliado toda vez que você receber um prompt. Isso significa que precisa haver uma $PWDstring real no valor de PS1. Mas,

PS1="$PWD $ "

vou colocar o valor dePWD no momento em que a instrução de atribuição é executadaem PS1. PS1será algo como /home/poldie $e nunca mudará depois disso. Você não quer isso.

PS1="\$PWD $ "

A barra invertida citará o $, de modo que PS1contém a string literal $PWD $. Você quer isso.

PS1='$PWD $ '

fará a mesma coisa. Os parâmetros não são expandidos quando colocados entre aspas simples.

(Nota: originalmente eu tinha todas essas exportinstruções porque o OP optou por escrevê-las como exportinstruções. @Kusalananda as removeu. Não tenho certeza do porquê. Exportar PS1 é uma escolha válida se você deseja shells filhos (como aqueles gerados pelo :shcomando no vi) para manter seu prompt personalizado.)

Responder2

O \caractere escapa do caractere seguinte (especial). Nesse caso, ele escapa do $, que normalmente usamos para desreferenciar uma variável. Quando o shell avalia uma atribuição de variável, ele primeiro expande o lado direito da expressão. Sem o \before $PWD, o shell se expande $PWDe atribui o resultado a PS1.

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

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

informação relacionada