Bash PS1 e simples vs aspas duplas

0

Sou um novato no Linux e no Bash e gostaria de pedir ajuda para entender o papel das aspas simples e duplas ao atribuir o env var do PS1. Eu queria definir o terminal para sempre mostrar o diretório atual. No começo eu tentei isso:

export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)
export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)
export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)
export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)%pre%7\]'
7\]"
7\]'
7\]"

Isso fez com que o título do terminal fosse atualizado para mostrar o diretório atual quando eu pressionava Enter , mas não se eu posteriormente fosse para outro lugar .

Por meio de tentativa e erro sem objetivo, eu tentei:

%pre%

A segunda versão, usando as aspas simples, teve o efeito desejado: o título do terminal foi atualizado toda vez que eu cd'ed para um novo diretório.

Alguém pode explicar por que o uso de aspas simples e duplas difere dessa maneira? Obrigado.

Encontrei esta discussão: Como alterar o título de a janela do mintty? mas o OP parece não ter sinalizado uma resposta, e as respostas que eu tentei desse link pareceram não ter nenhum efeito no meu shell.

    
por StoneThrow 04.08.2016 / 08:43

1 resposta

0

A diferença entre aspas simples e aspas duplas é a interpolação.

No primeiro exemplo, o shell interpola a expressão entre aspas duplas antes de atribuí-la à variável PS1, então o valor da variável, após a interpolação, seria

> /home/user

No segundo exemplo, por causa das aspas simples, o shell literalmente atribui a expressão à variável, o que causa o comportamento esperado (sempre que um prompt é impresso, o bash interpola a expressão com base no diretório atual). O valor de PS1 seria:

\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)
$ a='hello'
$ b="${a} world"
$ c='${a} world'

$ echo $b
hello world
$ echo $c
${a} world
7\]

Você pode verificar isso facilmente com alguns comandos:

> /home/user

Em $b , a variável a é interpolada na string, mas em $c não é, então a string é literalmente impressa.

    
por 04.08.2016 / 09:46