
En ksh en una vieja caja Solaris usé:
export PS1="$PWD $"
para configurar el mensaje en el directorio actual. Funciona muy bien hasta que haces cd en otro lugar y luego ves que no evalúa PWD cada vez. Noto que se soluciona configurando PS1 de esta manera:
export PS1="\$PWD $"
Solo tengo curiosidad por saber cómo se llama, cómo funciona, otras aplicaciones, etc. (Es una de esas cosas que se resiste bastante a buscar en Google).
Respuesta1
Algunos documentos ayudarán a explicar esto.
Desde elDocumento de estándares POSIX para el shell:
Las siguientes variables afectarán la ejecución del shell:
PS1: cada vez que un shell interactivo esté listo para leer un comando, el valor de esta variable estará sujeto a la expansión de parámetros y se escribirá en error estándar.
...
Comillas simples
Encerrar caracteres entre comillas simples preservará el valor literal de cada carácter dentro de las comillas simples.
...
Comillas dobles
Encerrar caracteres entre comillas dobles preservará el valor literal de todos los caracteres entre comillas dobles, con la excepción de
$: El signo del dólar conservará su significado especial introduciendo la expansión de parámetros
...
Carácter de escape (barra invertida )
Una barra invertida que no esté entre comillas conservará el valor literal del siguiente carácter.
Entonces, el valor de PS1
está sujeto a la expansión de parámetros, y esto es lo que desea, por lo que $PWD
se evaluará cada vez que reciba un mensaje. Esto significa que debe haber una $PWD
cadena real en el valor de PS1
. Pero,
PS1="$PWD $ "
pondrá el valor dePWD
en el momento en que se ejecuta la declaración de asignaciónen PS1
. PS1
será algo así como /home/poldie $
y nunca cambiará después de eso. No quieres eso.
PS1="\$PWD $ "
La barra invertida citará $
, por lo que PS1
contiene la cadena literal $PWD $
. Tu quieres esto.
PS1='$PWD $ '
hará lo mismo. Los parámetros no se expanden cuando están entre comillas simples.
(Nota: originalmente tenía todos estos como export
declaraciones porque el OP decidió escribirlos como export
declaraciones. @Kusalananda los eliminó. No estoy seguro de por qué. Exportar PS1 es una opción válida si desea shells secundarios (como los generados por el :sh
comando en vi) para conservar su mensaje personalizado).
Respuesta2
El \
carácter escapa del siguiente carácter (especial). En este caso, escapa del $
, que normalmente usamos para desreferenciar una variable. Cuando el shell evalúa una asignación de variable, primero expande el lado derecho de la expresión. Sin lo \
anterior $PWD
, el shell se expande $PWD
y asigna el resultado a PS1
.
Sin embargo, con \
, el shell la trata $PWD
como una cadena literal y la asigna tal cual PS1
, de modo que PS1
contenga la cadena $PWD
y no el valor expandido de la variable $PWD
. Cuando el shell está a punto de mostrar el mensaje, una vez más realiza la expansión variable, y esta vez, porque $PS1
contiene $PWD
,sin el\
, el shell lo expande exitosamente al directorio actual.
Se puede usar el mismo enfoque para crear nombres de variables dinámicas en scripts de shell (el rcNG
sistema NetBSD lo usa bastante, especialmente en scripts que controlan interfaces de red, donde la cantidad de designaciones de adaptadores de red en NetBSD y FreeBSD hace que no sea práctico codificar explícitamente para cada uno). ).