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

0

Я новичок в 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? но ОП, похоже, не помечал ответ, и те ответы, которые я пробовал по этой ссылке, похоже, не оказали никакого влияния на мою оболочку.

StoneThrow
источник

Ответы:

0

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

В первом примере оболочка интерполирует выражение между двойными кавычками, прежде чем присвоить его переменной 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нее нет, поэтому строка буквально печатается.

mtak
источник