Significado de \ antes de la variable de entorno

Significado de \ antes de la variable de entorno

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 PS1está sujeto a la expansión de parámetros, y esto es lo que desea, por lo que $PWDse evaluará cada vez que reciba un mensaje. Esto significa que debe haber una $PWDcadena 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. PS1será algo así como /home/poldie $y nunca cambiará después de eso. No quieres eso.

PS1="\$PWD $ "

La barra invertida citará $, por lo que PS1contiene 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 exportdeclaraciones porque el OP decidió escribirlos como exportdeclaraciones. @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 :shcomando 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 $PWDy asigna el resultado a PS1.

Sin embargo, con \, el shell la trata $PWDcomo una cadena literal y la asigna tal cual PS1, de modo que PS1contenga la cadena $PWDy 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 $PS1contiene $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 rcNGsistema 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). ).

información relacionada