Bash
在 bash 提示符中引用目錄名稱
我想在提示符中引用目前目錄。
例如,如果我這樣做:
mkdir $'new\nline'; cd $'new\nline'
我希望我的提示顯示
$'new\nline'
,而不是列印文字換行符。我看到嘗試在以下位置列印反斜杠 (
\
) 的有趣行為bash 5.0.9
:p='\\n' && echo -E "${p@P}" # 2 slashes; output = '\n' p='\\\\n' && echo -E "${p@P}" # 4 slashes; output = '\n' p='\\\\\\n' && echo -E "${p@P}" # 6 slashes; output = '\\n' p='\\\\\\\\n' && echo -E "${p@P}" # 8 slashes; output = '\\n'
注意:
${parameter@P}
是一個字元串,它是擴展值的結果,parameter
就好像它是一個提示一樣為什麼輸出與(2 和 4)和(6 和 8)斜杠等效?
鑑於這種混亂,並且:
mkdir '\\n' && cd '\\n'
我不知道如何以程式方式將其轉換
\\n
為字元串,使其在提示符中顯示為:\\\\n
或$'\\\\n'
,以及處理文字換行符的情況。如何獲取提示中引用的目錄名稱,例如:
~
為子目錄顯示$HOME
和前導~/
- 僅在需要時才轉義其他路徑
- 顯示的字元串的複制粘貼是引用目前目錄的有效 shell 令牌
例如
"$HOME/dir with spaces"
應該顯示為:
~/dir\ with\ spaces
~/$'dir with spaces'
~/'dir with spaces'
如果我
\w
在提示中包含 和cd $'/tmp/new\nline'
,則 Bash 僅/tmp/newline
在提示中顯示。它似乎沒有列印文字換行符,但這也不是一個明確的輸出格式。
${var@P}
旨在擴展提示樣式的轉義,例如\u
使用者名,\h
主機名和\w
工作目錄,我懷疑您是否想要這些。相反${var@Q}
,哪個引用輸出可能更有用?設置
PS1='${PWD@Q}\$ '
,我得到提示:$'/tmp/new\nline'$
,或者'/tmp'$
路徑是否更好。另一種可能是PS1='$(printf "%q" "$PWD")\$ '
,它在某些情況下給出不同的引用,例如,在“好”路徑的情況下將引號排除在外,因此/tmp$
。要將主目錄顯示為波浪號,一種選擇是手動進行替換:
set_ppath() { printf -v ppath "%q" "$PWD" ppath="${ppath/$HOME/"~"}"; } PROMPT_COMMAND=set_ppath PS1='$ppath\$ '
但是,如果它的一部分需要引用,它仍然會引用*整個路徑。*為了解決這個問題,我想你必須一點一點地走這條路。
不過,我不知道為什麼要
${var@P}
像這樣折疊反斜杠。