Почему, когда я ввожу эту команду, приглашение изменится на мой каталог?
PS1='$(pwd)'
Я использую одинарные кавычки, что означает отсутствие интерполяции, иначе echo '$(pwd)'
—— →$(pwd)
Кроме того, скажем, что мы выяснили, почему это работает ... почему оно функционирует иначе PS1=$(pwd)
? (без кавычек вообще)
Под другим я подразумеваю, что если я использую кавычки, то приглашение будет продолжать меняться в моем текущем каталоге, когда я перемещаюсь через терминал. Но если я не использую кавычки, то приглашение всегда будет оставаться в том каталоге, в котором я находился при первом вводе командыPS1=$(pwd)
Почему?
Ответы:
Когда вы просто присваиваете значение переменной,
$(...)
выражение вычисляется, если оно не заключено в одинарные кавычки (или не имеет обратной косой черты). Чтобы понять, попробуйте сравнить эти два:Значение
A
сразу становится строкой/home/yourusername
и, очевидно, не запоминается, откуда взялась эта строка, оно остается прежним, даже если вы меняете каталог. Однако значениеB
становится литеральной строкой$(pwd)
без интерпретации.Теперь в значении
PS1
чего-то особенного происходит: всякий раз, когда выводится подсказка, интерпретируются определенные специальные конструкции, например, подстановка команды$(...)
выполняется точно так же, как это было сделано выше при назначенииA
переменной. Очевидно, что если выPS1
содержите буквальную строку вашего домашнего каталога (как указано вышеA
), то это никак не изменится. Но если она содержит строку$(pwd)
(как указано вышеB
), то она оценивается каждый раз, когда выводится приглашение, и, следовательно, отображается ваш фактический каталог.источник
Как в bash, так и в zsh, значение
PS1
не используется как приглашение как есть, оно подвергается некоторым расширениям. Эти правила отличаются для двух оболочек, но в обеих случаях одна из шага заключается в выполнении «доллар» разложение (переменная подстановки, подстановки команд, арифметическая оценка) с таким же синтаксисом , как и в обычном синтаксисе оболочки ( , , или , , ) ,$VARIABLE
${VARIABLE}
$(COMMAND)
`COMMAND`
$((EXPRESSION))
$[EXPRESSION]
shopt -u promptvars
.setopt prompt_subst
.Если в приглашении включено расширение доллара,
PS1='$(pwd)'
задаетсяPS1
6-значное значение$(pwd)
и, следовательно, происходит$(pwd)
подстановка и, следовательно,pwd
команда, которая будет выполняться каждый раз, когда оболочка отображает новое приглашение. С другой стороны,PS1=$(pwd)
устанавливаетPS1
на то, что является текущим рабочим каталогом оболочки в данный момент. Если у вас отключено расширение доллара, тоPS1='$(pwd)'
приглашение будет буквальной строкой$(pwd)
.Обратите внимание, что есть более удобные способы получить рабочий каталог в приглашении:
\w
, которая сокращает ваш домашний каталог до~
и может быть обрезана установкойPROMPT_DIRTRIM
.%/
или%~
(%/
так же , как$PWD
,%~
сокращает домашние каталоги), которые могут иметь подрезки настройки.$PWD
это эквивалентно$(pwd)
: вам не нужно запускать подпроцесс для получения текущего рабочего каталога.источник
Потому что без кавычек, $ (pwd) оценивается, когда установлен PS1. С кавычками оценка $ (pwd) откладывается до отображения приглашения.
Без кавычек PS1 устанавливается в текущий каталог в то время, когда PS1 установлен. С одинарными кавычками PS1 установлен в $ (pwd), что означает, что он будет оценивать и печатать текущий каталог каждый раз, когда отображается подсказка.
источник