Answers:
当您简单地为变量分配值时,将对$(...)
表达式求值,除非将其括在单引号中(或使用反斜杠转义)。要了解,请尝试比较这两个:
A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"
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)
。
请注意,在提示符下有更方便的方法来获取工作目录:
因为没有引号,所以设置PS1时将评估$(pwd)。用引号将$(pwd)的评估推迟到显示提示之前。
如果不带引号,则在设置PS1时将PS1设置为当前目录。使用单引号将PS1设置为$(pwd),这意味着它将在每次显示提示时评估并打印当前目录。