Bash

在 bash 提示符中引用目錄名稱

  • September 25, 2019

我想在提示符中引用目前目錄。

例如,如果我這樣做:

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}像這樣折疊反斜杠。

引用自:https://unix.stackexchange.com/questions/543473