我想在提示符中引用当前目录。
例如,如果我这样做:
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$
。要将主目录显示为波浪号,一种选择是手动进行替换:
但是,如果它的一部分需要引用,它仍然会引用整个路径。为了解决这个问题,我想你必须一点一点地走这条路。
不过,我不知道为什么要
${var@P}
像这样折叠反斜杠。根据 ilkkachu 的回答,我想出了:
这将引用的目录作为文字文本
$PS1
而不是通过变量包含在内。这样做的好处是我可以继续在我的眼睛发现更容易解析的目录中使用彩色斜线。