Bash PS1 и одинарные против двойных кавычек

625
StoneThrow

Я новичок в Linux и Bash и хотел бы попросить помочь понять роль одинарных и двойных кавычек при назначении переменной env для PS1. Я хотел, чтобы терминал всегда показывал текущий каталог. Сначала я попробовал это:

export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]" 

Это привело к тому, что в обновленном заголовке терминала показывался текущий каталог, когда я нажимал Enter, но не в том случае, если впоследствии я перешел в другое место .

Через бесцельные методы проб и ошибок я в конце концов попытался:

export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]' 

Вторая версия, использующая одинарные кавычки, дала желаемый эффект: заголовок терминала обновлялся каждый раз, когда я переходил в новый каталог.

Может кто-нибудь объяснить, почему использование одинарных и двойных кавычек отличается таким образом? Спасибо.

Я нашел это обсуждение: Как изменить заголовок окна Mintty? но ОП, кажется, не помечал ответ, и те ответы, которые я пробовал по этой ссылке, похоже, не влияли на мою оболочку.

0

1 ответ на вопрос

0
mtak

Разница между одинарными и двойными кавычками заключается в интерполяции.

В первом примере оболочка интерполирует выражение между двойными кавычками, прежде чем присвоить его переменной PS1, поэтому значение переменной после интерполяции будет равно

> /home/user 

Во втором примере из-за одинарных кавычек оболочка буквально присваивает выражение переменной, что вызывает ожидаемое поведение (каждый раз, когда выводится приглашение, bash интерполирует выражение на основе текущего каталога). Значение PS1 будет:

\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\] 

Вы можете легко проверить это с помощью пары команд:

$ a='hello' $ b="$ world" $ c='$ world'  $ echo $b hello world $ echo $c $ world 

В $b, переменная aинтерполируется в строку, но в $cнее нет, поэтому строка печатается буквально.

Похожие вопросы