Bash PS1 и одинарные против двойных кавычек
Я новичок в 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? но ОП, похоже, не помечал ответ, и те ответы, которые я пробовал по этой ссылке, похоже, не оказали никакого влияния на мою оболочку.
1 ответ
Разница между одинарными и двойными кавычками заключается в интерполяции.
В первом примере оболочка интерполирует выражение между двойными кавычками, прежде чем присвоить его переменной PS1, поэтому значение переменной после интерполяции будет равно
> /home/user
Во втором примере из-за одинарных кавычек оболочка буквально присваивает выражение переменной, что вызывает ожидаемое поведение (каждый раз, когда выводится приглашение, bash интерполирует выражение на основе текущего каталога). Значение PS1 будет:
\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]
Вы можете легко проверить это с помощью пары команд:
$ a='hello'
$ b="${a} world"
$ c='${a} world'
$ echo $b
hello world
$ echo $c
${a} world
В $b
переменная a
интерполируется в строку, но в $c
это не так, поэтому строка буквально печатается.