要設置場景,我正在編輯我的/.bash_profile,並且希望當前目錄以及PS1中所述目錄中的文件。雖然它的作品,我發現了一個奇怪的錯誤與間距:通過變量調用命令時出現空格錯誤
(~) ( 12)
我不明白這是爲什麼,因爲 - 我的知識 - 這個代碼不應該並稱空白。
lines=$(ls | wc -l)
PS1='\n\e[2m(\w) ($lines)\e[22m\n> '
我不知道爲什麼會發生這種情況,而有些Bash魔術師會很方便。
要設置場景,我正在編輯我的/.bash_profile,並且希望當前目錄以及PS1中所述目錄中的文件。雖然它的作品,我發現了一個奇怪的錯誤與間距:通過變量調用命令時出現空格錯誤
(~) ( 12)
我不明白這是爲什麼,因爲 - 我的知識 - 這個代碼不應該並稱空白。
lines=$(ls | wc -l)
PS1='\n\e[2m(\w) ($lines)\e[22m\n> '
我不知道爲什麼會發生這種情況,而有些Bash魔術師會很方便。
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
時你所在的目錄的文件數,可能是你的主目錄。獲取文件數在提示本身會得到當前目錄的文件數量,無論可能如何。)
感謝您的幫助。雖然你的第二個,我首先假設代碼的例子,我選擇放棄變量,並打印「ls | wc -l | xargs」以保持可讀性,由於我的學習目標。 –
真的,不要使用'ls | wc -l'。如果任何文件名本身包含換行符,則會超額計算。如果你的目標是要學習,學會以正確的方式做事,即使錯誤的方式很少會傷害你。 – chepner
感謝您指出,我沒有意識到這個問題。 –