2013-06-03 103 views
0

當我設置我的PS1 ='$ PWD'時,命令行顯示當前目錄的路徑: /home/myname並且它在我更改目錄時發生變化。單/雙引號ksh

但是,當我將其更改爲「$ PWD」(雙引號)時,無論我現在在哪裏,它都會向我顯示/ home/myname。從我讀過的內容可以看出,單引號顯示它的內容,並且不會像$那樣擴展特殊符號。那麼爲什麼它以這種方式工作?

回答

1

「$ PWD」立即解決。所以你基本上將PS1設置爲一個固定值(在設置時PWD的值)。當您設置爲'$ PWD'時,它不會立即解決,因此它會在使用時解析,並在更改目錄時進行更改。因此,雙引號擴展(固定字符串)如預期,而單引號不是。

+0

是的,但爲什麼教程會說單引號顯示它們究竟是什麼?所以'$ PWD'應該打印「$ PWD」? – CuriousGuy

+0

單引號可防止對當前shell /命令的解析度,而雙引號則允許在當前shell /命令中進行解析。當前shell /命令是「設置PS1變量的值」,而不是後續讀取該值的shell操作。使用雙引號就像字面上寫「set PS1 =/a/b/c」,它變得固定。使用單引號表示「在set命令期間不解析該值」,這會導致在稍後使用它顯示提示時解析該值,因此它會更改。 – user1676075

0

PS1是一個特殊的變量。從ksh手冊頁:

PS1 The value of this variable is expanded for parameter expansion, 
     command substitution, and arithmetic substitution to define the 
     primary prompt string which by default is ``$''. [...] 

因此,在顯示提示符之前,PS1的值會得到特殊處理。當使用單引號,PS1的值僅僅是字符串$PW¯¯d 但是當需要一個提示,這樣的提示得到 當前目錄KSH將進一步擴大變量。