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?
Respostas:
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:O valor de
A
imediatamente se torna a string/home/yourusername
e, obviamente, não é lembrado de onde ela vem, ela permanece a mesma, mesmo se você alterar o diretório. O valor deB
, no entanto, torna-se a sequência literal$(pwd)
sem ser interpretada.Agora, no valor de
PS1
algo 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 àA
variável. Obviamente, se o seuPS1
contém a string literal do diretório inicial (como acimaA
), não há como mudar. Mas se ele contiver a sequência$(pwd)
(como acimaB
), ela será avaliada sempre que o prompt for impresso e, portanto, seu diretório real será exibido.fonte
No bash e no zsh, o valor de
PS1
nã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]
shopt -u promptvars
.setopt prompt_subst
.Com a expansão do dólar no prompt ativada,
PS1='$(pwd)'
definePS1
o valor de 6 caracteres$(pwd)
e, portanto, faz$(pwd)
com que seja substituído e, portanto, opwd
comando seja executado, sempre que o shell exibir um novo prompt. Por outro lado,PS1=$(pwd)
definePS1
como 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:
\w
, que abrevia o diretório inicial~
e pode ser aparada pela configuraçãoPROMPT_DIRTRIM
.%/
or%~
(%/
é o mesmo que$PWD
,%~
abrevia diretórios pessoais), que pode ter uma configuração de recorte.$PWD
é equivalente a$(pwd)
: você não precisa executar um subprocesso para obter o diretório de trabalho atual.fonte
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.
fonte