PS1 = '$ (pwd)' por qué esto funciona y por qué es diferente de PS1 = $ (pwd)


18

¿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é?


2
Ahorre algunos ciclos de CPU y use el equivalente PS1 = '$ PWD'
jlliagre

Respuestas:


29

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:

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

El valor de Ainmediatamente se convierte en la cadena /home/yourusernamey, obviamente, no se recuerda de dónde proviene esta cadena, permanece igual incluso si cambia el directorio. BSin embargo, el valor de se convierte en la cadena literal $(pwd)sin ser interpretado.

Ahora, en el valor de PS1algo 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 la Avariable. Obviamente, si su PS1contiene la cadena literal de su directorio de inicio (como arriba con A), entonces no hay forma de que pueda cambiar. Pero si contiene la cadena $(pwd)(como arriba con B), entonces se evalúa cada vez que se imprime el mensaje y, por lo tanto, se muestra su directorio real.


14

Tanto en bash como en zsh, el valor de PS1no 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]

  • En bash, la expansión en dólares se activa de manera predeterminada, pero se puede desactivar con shopt -u promptvars.
  • En zsh, la expansión en dólares está desactivada de forma predeterminada, pero muchas personas (y la mayoría de los marcos de configuración que encontrará en la web) la activan setopt prompt_subst.

Con la expansión del dólar en la solicitud activada, se PS1='$(pwd)'establece PS1en el valor de 6 caracteres $(pwd)y, por lo tanto, hace $(pwd)que se sustituya y, por lo tanto, pwdse ejecute el comando, cada vez que el shell muestra una nueva solicitud. Por otro lado, se PS1=$(pwd)establece PS1en el directorio de trabajo actual del shell en ese momento. Si tenía desactivada la expansión en dólares, entonces PS1='$(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:

  • En bash, con un escape de barra invertida como \w, que abrevia su directorio de inicio ~y puede recortarse mediante la configuración PROMPT_DIRTRIM.
  • En zsh, con un porcentaje de escape como %/o%~ ( %/es lo mismo $PWD, %~abrevia los directorios de inicio), que puede tener una configuración de recorte.
  • En cualquier shell (y en cualquier otro shell de estilo Bourne), $PWDes equivalente a $(pwd): no es necesario ejecutar un subproceso para obtener el directorio de trabajo actual.

7

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.