¿Por qué cuando ingreso este comando el aviso cambia a mi directorio?
PS1='$(pwd)'
Estoy usando comillas simples, lo que significa que no hay interpolación, también conocido como echo '$(pwd)'
—— →$(pwd)
Además, digamos que aclaramos por qué esto funciona ... ¿por qué funciona de manera diferente PS1=$(pwd)
? (sin comillas)
Por diferente quiero decir que si uso las comillas, el mensaje seguirá cambiando a mi directorio actual mientras navego por el terminal. Pero si no uso comillas, la solicitud siempre seguirá siendo el directorio en el que estaba cuando ingresé el comando por primera vezPS1=$(pwd)
¿por qué?
Respuestas:
Cuando simplemente asigna un valor a una variable, la
$(...)
expresión se evalúa a menos que esté entre comillas simples (o con barra invertida). Para entender, intente y compare estos dos:El valor de
A
inmediatamente se convierte en la cadena/home/yourusername
y, obviamente, no se recuerda de dónde proviene esta cadena, permanece igual incluso si cambia el directorio.B
Sin embargo, el valor de se convierte en la cadena literal$(pwd)
sin ser interpretado.Ahora, en el valor de
PS1
algo especial sucede: cada vez que se imprime la solicitud, se interpretan ciertas construcciones especiales, por ejemplo, la sustitución del comando$(...)
se realiza exactamente como sucedió anteriormente en la asignación a laA
variable. Obviamente, si suPS1
contiene la cadena literal de su directorio de inicio (como arriba conA
), entonces no hay forma de que pueda cambiar. Pero si contiene la cadena$(pwd)
(como arriba conB
), entonces se evalúa cada vez que se imprime el mensaje y, por lo tanto, se muestra su directorio real.fuente
Tanto en bash como en zsh, el valor de
PS1
no se usa como un aviso tal como está, experimenta algunas expansiones. Las reglas son diferentes para las dos carcasas, pero en ambos casos, uno de los paso es realizar expansiones “dólar” (sustitución de variables, las sustituciones de comando, evaluación aritmética) con la misma sintaxis que la sintaxis del shell normal ( , , o , , ) .$VARIABLE
${VARIABLE}
$(COMMAND)
`COMMAND`
$((EXPRESSION))
$[EXPRESSION]
shopt -u promptvars
.setopt prompt_subst
.Con la expansión del dólar en la solicitud activada, se
PS1='$(pwd)'
establecePS1
en el valor de 6 caracteres$(pwd)
y, por lo tanto, hace$(pwd)
que se sustituya y, por lo tanto,pwd
se ejecute el comando, cada vez que el shell muestra una nueva solicitud. Por otro lado, sePS1=$(pwd)
establecePS1
en el directorio de trabajo actual del shell en ese momento. Si tenía desactivada la expansión en dólares, entoncesPS1='$(pwd)'
la solicitud sería la cadena literal$(pwd)
.Tenga en cuenta que hay formas más convenientes de obtener el directorio de trabajo en el indicador:
\w
, que abrevia su directorio de inicio~
y puede recortarse mediante la configuraciónPROMPT_DIRTRIM
.%/
o%~
(%/
es lo mismo$PWD
,%~
abrevia los directorios de inicio), que puede tener una configuración de recorte.$PWD
es equivalente a$(pwd)
: no es necesario ejecutar un subproceso para obtener el directorio de trabajo actual.fuente
Porque sin las comillas, $ (pwd) se evalúa cuando se establece PS1. Con las comillas, la evaluación de $ (pwd) se pospone hasta que se muestre la solicitud.
Sin las comillas, PS1 se establece en el directorio actual en el momento en que se establece PS1. Con las comillas simples, PS1 se establece en $ (pwd), lo que significa que evaluará e imprimirá el directorio actual cada vez que se muestre el mensaje.
fuente