Por que definir o prompt do bash (PS1) manualmente faz com que o root tenha um $ em vez de um #?


11

Estou no CentOS 6.4. Por padrão, o prompt do usuário root possui um #símbolo, ou seja, se parece com isso [root@myserver ~]# .

echo $PS1imprime [\u@\h \W]\$; mas se eu fizer PS1="[\u@\h \W]\$"(que não deve mudar nada, AFAICS), eu acabar com um prompt que se parece com isso: [root@myserver ~]$.

Por que quando eu tento defini-lo eu mesmo (eu gostaria de mudar para algo mais útil), ele interpreta o $literal? Quase todas as páginas que encontro (por exemplo, Como: alterar / configurar o prompt personalizado do bash (PS1) ) afirma que isso \$deve resultar em um #para o usuário root.


PS1=[\u@\h \W]\$retorna -bash: W]$: command not found.
choroba

@choroba oops, desculpe, perdi as aspas duplas, deveria ter sido PS1="[\u@\h \W]\$".
precisa saber é o seguinte

Respostas:


14

Na sua pergunta, você implica que não está citando a linha; isso está claramente errado, porque o espaço separaria a atribuição de argumento "PS1 = [\ u @ \ h" do comando "\ W] \ $". Por favor, entenda que todo personagem é importante.

Enfim, o que você provavelmente está fazendo é usar aspas duplas (") em vez de aspas simples ('). Elas se comportam de maneira muito diferente quando se trata do shell interpretar o que você digitou. Com aspas duplas, ele tentará fazer coisas inteligentes com as seqüências de barra invertida / algum caractere. Para esta tarefa, como não há nada de especial em \ u, \ he \ W, eles são deixados intocados; colchetes podem ter significados especiais em vários lugares, mas não neste caso, para que eles também sejam deixados no lugar; mas como a $possui vários significados, todos eles especiais, a \$sequência é interpretada como "ignore a especialidade do cifrão e deixe-o lá", e essa sequência é substituída por um cifrão único não mais analisado.O resultado de tudo isso é atribuído aPS1, e como há um cifrão literal, e não a \$sequência mágica quando o shell cria o prompt real, você apenas obtém o cifrão, e não o caractere dependente do usuário efetivo. A análise real é um pouco mais complicada, mas essa é a essência desse exemplo em particular.

O que você digitou: PS1="[\u@\h \W]\$ "
O que o shell atribuiu: PS1 <- "[\u@\h \W]$ "
O que você queria: PS1 <- "[\u@\h \W]\$ "
O que você deveria digitar:PS1='[\u@\h \W]\$ '

O que você deve fazer em seguida: Leia algo como este tutorial para saber mais sobre a citação de shell.


1
Sim, você estava no local, eu estava usando aspas duplas (desculpe por tê-las perdido na pergunta original), obrigado por apontar meu erro.
Stripybadger

Se você nunca fazer necessidade de usar aspas duplas, por algum motivo, o uso PS1="...\\\$"para assegurar que o par literal \$é armazenado em PS1para o shell para interpretar mais tarde.
chepner

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.