Почему установка подсказки bash (PS1) вручную приводит к тому, что root имеет $ вместо #?

11

Я на CentOS 6.4. По умолчанию приглашение пользователя root имеет #символ, то есть выглядит примерно так [root@myserver ~]# .

echo $PS1распечатывает [\u@\h \W]\$; но если я PS1="[\u@\h \W]\$"(который не должен ничего менять, afaics), я в конечном итоге с запросом , который выглядит следующим образом : [root@myserver ~]$.

Почему, когда я пытаюсь установить это сам (в конечном счете, я хотел бы изменить его на что-то более полезное), оно интерпретирует $буквально? Практически на каждой странице, которую я могу найти (например, Как: изменить / настроить пользовательское приглашение bash (PS1) ), указано, что это \$должно привести #к появлению пользователя root.

stripybadger
источник
PS1=[\u@\h \W]\$возвращается -bash: W]$: command not found.
Чороба
@choroba Ой, извините, пропустил двойные кавычки, это должно было быть PS1="[\u@\h \W]\$".
stripybadger

Ответы:

14

В своем вопросе вы подразумеваете, что вообще не цитируете строку; это явно неправильно, потому что тогда пробел будет отделять назначение аргумента "PS1 = [\ u @ \ h" от команды "\ W] \ $". Пожалуйста, поймите, что каждый персонаж важен.

В любом случае, вероятно, вы используете двойные кавычки ("), а не одинарные ('). Они ведут себя очень по-разному, когда речь идет о оболочке, интерпретирующей то, что вы ввели. С помощью двойных кавычек она будет пытаться делать умные вещи с последовательности обратной косой черты / некоторых символов. Для этого назначения, поскольку в \ u, \ h и \ W нет ничего особенного, они остаются нетронутыми; квадратные скобки могут иметь специальные значения в разных местах, но не в этом случае, поэтому они также оставлены на месте, но, поскольку a $имеет множество значений, все они особенные, \$последовательность интерпретируется как «игнорировать особенность знака доллара и просто оставить его там», и эта последовательность заменяется на неразборчивый одиночный знак доллара. Результат всего этого присваиваетсяPS1и, поскольку есть буквальный знак доллара, а не волшебная \$последовательность, когда оболочка создает фактическое приглашение, вы просто получаете знак доллара, а не символ, зависящий от эффективного пользователя. Фактический синтаксический анализ немного сложнее, но это суть этого конкретного примера.

Что вы набрали: PS1="[\u@\h \W]\$ "
Что назначил оболочка: PS1 <- "[\u@\h \W]$ "
Что вы хотели: PS1 <- "[\u@\h \W]\$ "
Что вы должны набрать:PS1='[\u@\h \W]\$ '

Что вы должны сделать дальше: Прочтите что-то вроде этого урока, чтобы узнать больше о цитировании оболочки.

Гейб
источник
1
Да, вы были на месте, я использовал двойные кавычки (извините, что пропустил их из исходного вопроса), спасибо за указание на мою ошибку.
stripybadger
Если вы когда - нибудь сделать , необходимо использовать двойные кавычки , по какой - то причине, использование PS1="...\\\$"для обеспечения того , чтобы в буквальном смысле пара \$сохраняется в PS1течение оболочки интерпретировать позже.
chepner
0

Вы перешли к корневому пользователю с помощью sudo su, suили войдя в систему под корень? Используйте, idчтобы проверить, с какого компьютера вы вошли в систему, поскольку это может повлиять на то, какой профиль вы на самом деле редактируете.

Проверьте ответы на /ubuntu/305052/changing-behavior-of-bash-prompt-when-functioning-as-root

dunxd
источник