PS1 ='$(pwd)'为什么有效,为什么与PS1 = $(pwd)不同


18

为什么当我输入此命令时,提示会更改为我的目录?

PS1='$(pwd)'

我使用的是单引号,也就是说没有插值,也就是echo '$(pwd)'-→$(pwd)

此外,请说我们已经弄清了它为什么有效……为什么它的功能不同于PS1=$(pwd)?(完全没有引号)

通过不同的方式,我的意思是如果我使用引号,那么当我浏览终端时,提示将不断更改为当前目录。但是,如果我不使用引号,那么提示符将始终保留为我首次输入命令时所在的目录PS1=$(pwd)

为什么?


2
节省一些CPU周期,并使用等效的PS1 ='$
PWD'– jlliagre

Answers:


29

当您简单地为变量分配值时,将对$(...)表达式求值,除非将其括在单引号中(或使用反斜杠转义)。要了解,请尝试比较这两个:

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

A立即值将成为字符串,/home/yourusername并且显然不会记住该字符串的来源,即使您更改目录,它也保持不变。B但是,的值将变成文字字符串,$(pwd)而不会被解释。

现在,PS1发生了一些特殊的值:每当打印提示时,便会解释某些特殊的结构,例如,命令替换$(...)的执行方式与上面对A变量的赋值完全相同。显然,如果您PS1包含主目录的文字字符串(如上面的所示A),则无法更改它。但是,如果它包含字符串$(pwd)(如上的所示B),则在打印提示时都会对其进行评估,因此会显示您的实际目录。


14

在bash和zsh中,的值PS1都不能按原样用作提示,它会有所扩展。规则为两个壳有所不同,但在这两种情况下,所述步骤中的一个是与所述相同的语法在正常壳语法来执行“美元”扩展(变量替换,命令置换,算术评价)( ,, 或,,) 。$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • 在bash中,美元扩展默认情况下处于启用状态,但可以使用来关闭shopt -u promptvars
  • 在zsh中,默认情况下,美元扩展功能是关闭的,但是许多人(以及您在网络上可以找到的大多数配置框架)都通过启用了美元扩展功能setopt prompt_subst

每次提示显示时,打开提示中的美元扩展功能时,PS1='$(pwd)'将其设置PS1为6个字符的值,$(pwd)并导致$(pwd)替换,因此pwd要执行的命令。另一方面,PS1=$(pwd)设置PS1为当时外壳程序的当前工作目录。如果关闭了美元扩展功能,则PS1='$(pwd)'提示将为原义字符串$(pwd)

请注意,在提示符下有更方便的方法来获取工作目录:

  • 在bash中,请使用反斜杠转义符,例如\w,将您的主目录缩写为,~并且可以通过设置进行修剪PROMPT_DIRTRIM
  • 在zsh中,带有%的转义符,例如%/%~%/与相同$PWD%~缩写主目录),可以具有修整设置。
  • 在任何一个外壳程序(和任何其他Bourne风格的外壳程序)中,$PWD其等效于$(pwd):您无需运行子进程即可获取当前工作目录。

7

因为没有引号,所以设置PS1时将评估$(pwd)。用引号将$(pwd)的评估推迟到显示提示之前。

如果不带引号,则在设置PS1时将PS1设置为当前目录。使用单引号将PS1设置为$(pwd),这意味着它将在每次显示提示时评估并打印当前目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.