2016-08-23 62 views
0

要設置場景,我正在編輯我的/.bash_profile,並且希望當前目錄以及PS1中所述目錄中的文件。雖然它的作品,我發現了一個奇怪的錯誤與間距:通過變量調用命令時出現空格錯誤

(~) (  12) 

我不明白這是爲什麼,因爲 - 我的知識 - 這個代碼不應該並稱空白。

lines=$(ls | wc -l) 
PS1='\n\e[2m(\w) ($lines)\e[22m\n> ' 

我不知道爲什麼會發生這種情況,而有些Bash魔術師會很方便。

回答

2

PS1與大多數變量有點不同,至少在它的使用方式上有些不同。它的值不是簡單地打印到標準錯誤以顯示提示,如果將提示與echo "$PS1"的輸出進行比較,這一點很明顯。

評估規則與正常評估規則不同,正如您在此處看到的,最終顯示提示時,$lines的值中的前導空白不會從未引用的擴展$lines中刪除。要解決此

的一種方法是,以取代普通參數擴展一個shell命令確實進行正常的評價,然後捕獲該命令的輸出在提示中使用:

PS1='\n\e[2m(\w) ($(echo $lines))\e[22m\n> ' 

更好然而,不執行分析的ls輸出:創建一個數組並輸出它的長度:

PS1='\n\e[2m(\w) ($(f=(*); echo ${#f[@]}))\e[22m\n> ' 

(另外,除非你正在復位的lines之前每個值提示,在PROMPT_COMMAND中說,你總是會顯示當你設置lines時你所在的目錄的文件數,可能是你的主目錄。獲取文件數提示本身會得到當前目錄的文件數量,無論可能如何。)

+0

感謝您的幫助。雖然你的第二個,我首先假設代碼的例子,我選擇放棄變量,並打印「ls | wc -l | xargs」以保持可讀性,由於我的學習目標。 –

+1

真的,不要使用'ls | wc -l'。如果任何文件名本身包含換行符,則會超額計算。如果你的目標是要學習,學會以正確的方式做事,即使錯誤的方式很少會傷害你。 – chepner

+0

感謝您指出,我沒有意識到這個問題。 –

相關問題