PS1 = '$ (pwd)' por que isso funciona e por que isso é diferente de PS1 = $ (pwd)


18

Por que quando eu insiro este comando, o prompt muda para o meu diretório?

PS1='$(pwd)'

Estou usando aspas simples, o que significa que não há interpolação, também conhecida como echo '$(pwd)'—— →$(pwd)

Além disso, digamos que esclarecemos por que isso funciona ... por que está funcionando de maneira diferente PS1=$(pwd)? (sem aspas)

Por diferente, quero dizer que, se eu usar as aspas, o prompt continuará mudando para o meu diretório atual enquanto eu navego pelo terminal. Mas se eu não usar aspas, o prompt sempre será o diretório em que eu estava quando inseri o comandoPS1=$(pwd)

porque?


2
Salve alguns ciclos de CPU e use o equivalente PS1 = '$ PWD'
jlliagre

Respostas:


29

Quando você simplesmente atribui um valor a uma variável, a $(...)expressão é avaliada, a menos que esteja entre aspas simples (ou com barra invertida). Para entender, tente e compare estes dois:

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

O valor de Aimediatamente se torna a string /home/yourusernamee, obviamente, não é lembrado de onde ela vem, ela permanece a mesma, mesmo se você alterar o diretório. O valor de B, no entanto, torna-se a sequência literal $(pwd)sem ser interpretada.

Agora, no valor de PS1algo especial acontece: sempre que o prompt é impresso, certas construções especiais são interpretadas, por exemplo, a substituição do comando $(...)é realizada exatamente da maneira como aconteceu acima na atribuição à Avariável. Obviamente, se o seu PS1contém a string literal do diretório inicial (como acima A), não há como mudar. Mas se ele contiver a sequência $(pwd)(como acima B), ela será avaliada sempre que o prompt for impresso e, portanto, seu diretório real será exibido.


14

No bash e no zsh, o valor de PS1não é usado como um prompt como está, sofre algumas expansões. As regras são diferentes para as duas conchas, mas em ambos os casos, um dos passo é a realização de expansões “dólar” (substituição variável, substituições de comando, avaliação aritmética) com a mesma sintaxe como em sintaxe shell normal ( , , ou , , ) .$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • No bash, a expansão do dólar é ativada por padrão, mas pode ser desativada com shopt -u promptvars.
  • No zsh, a expansão do dólar está desativada por padrão, mas muitas pessoas (e a maioria das estruturas de configuração que você encontrará na web) o ativam setopt prompt_subst.

Com a expansão do dólar no prompt ativada, PS1='$(pwd)'define PS1o valor de 6 caracteres $(pwd)e, portanto, faz $(pwd)com que seja substituído e, portanto, o pwdcomando seja executado, sempre que o shell exibir um novo prompt. Por outro lado, PS1=$(pwd)define PS1como o diretório de trabalho atual do shell no momento. Se a expansão do dólar fosse desativada, PS1='$(pwd)'o prompt seria a string literal $(pwd).

Observe que existem maneiras mais convenientes de obter o diretório ativo no prompt:

  • No bash, com uma barra invertida como \w, que abrevia o diretório inicial ~e pode ser aparada pela configuração PROMPT_DIRTRIM.
  • No zsh, com uma porcentagem de escape como %/or%~ ( %/é o mesmo que $PWD, %~abrevia diretórios pessoais), que pode ter uma configuração de recorte.
  • No shell (e em qualquer outro shell no estilo Bourne), $PWDé equivalente a $(pwd): você não precisa executar um subprocesso para obter o diretório de trabalho atual.

7

Porque sem as aspas, o $ (pwd) é avaliado quando o PS1 está definido. Com as aspas, a avaliação de $ (pwd) é adiada até que o prompt seja exibido.

Sem as aspas, o PS1 é definido no diretório atual no momento em que o PS1 é definido. Com as aspas simples, o PS1 é definido como $ (pwd), o que significa que ele avaliará e imprimirá o diretório atual sempre que o prompt for exibido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.