¿Por qué al configurar el indicador bash (PS1) manualmente la raíz tiene un $ en lugar de un #?

11

Estoy en CentOS 6.4. Por defecto, la solicitud del usuario raíz tiene un #símbolo, es decir, se parece a algo así [root@myserver ~]# .

echo $PS1imprime [\u@\h \W]\$; pero si lo hago PS1="[\u@\h \W]\$"(que no debería cambiar nada, afaics), termino con un mensaje que es similar al siguiente: [root@myserver ~]$.

¿Por qué cuando trato de configurarlo yo mismo (en última instancia, me gustaría cambiarlo por algo más útil), ¿lo interpreta $literalmente? Casi todas las páginas que puedo encontrar (por ejemplo, Cómo: Cambiar / Configurar bash custom prompt (PS1) ) dice que \$debería dar como resultado un #para el usuario root.

stripybadger
fuente
PS1=[\u@\h \W]\$vuelve -bash: W]$: command not found.
choroba
@choroba oops, lo siento, perdí las comillas dobles, debería haber sido PS1="[\u@\h \W]\$".
stripybadger

Respuestas:

14

En su pregunta, implica que no está citando la línea; eso es claramente incorrecto, porque entonces el espacio separaría la asignación de argumento "PS1 = [\ u @ \ h" del comando "\ W] \ $". Tenga en cuenta que cada personaje es importante.

De todos modos, lo que probablemente esté haciendo es usar comillas dobles (") en lugar de simples ('). Se comportan de manera muy diferente cuando se trata de que el intérprete de comandos interprete lo que escribió. Con comillas dobles, intentará hacer cosas inteligentes con las secuencias de barra invertida / algún carácter. Para esta tarea, dado que no hay nada especial sobre \ u, \ h y \ W, no se tocan; los corchetes pueden tener significados especiales en varios lugares, pero no en este caso, así que también se dejan en su lugar; pero dado que $tiene una variedad de significados, todos ellos especiales, la \$secuencia se interpreta como "ignorar la especialidad del signo de dólar, y simplemente dejarla allí", y esa secuencia se reemplaza por un signo de dólar único sin analizar más. El resultado de todo eso se asigna aPS1, y dado que hay un signo de dólar literal, y no la \$secuencia mágica cuando el shell construye la solicitud real, solo obtienes el signo de dólar, y no el carácter efectivo dependiente del usuario. El análisis real es un poco más complicado, pero esa es la esencia de este ejemplo en particular.

Lo que escribió: PS1="[\u@\h \W]\$ "
Lo que asignó el shell: PS1 <- "[\u@\h \W]$ "
Lo que quería: PS1 <- "[\u@\h \W]\$ "
Lo que debe escribir:PS1='[\u@\h \W]\$ '

Lo que debe hacer a continuación: lea algo como este tutorial para obtener más información sobre las citas de shell.

Gabe
fuente
1
Sí, estabas en lo cierto, estaba usando comillas dobles (perdón por perderlas de la pregunta original), gracias por señalar mi error.
stripybadger
Si alguna vez se hace necesario utilizar comillas dobles, por alguna razón, su uso PS1="...\\\$"para asegurarse de que el par literal \$se almacena en PS1la cáscara para interpretar más tarde.
chepner