我想在 Linux 命令提示符中显示当前目录和父目录。例如,如果当前目录是/home/user/proj/src
,我希望显示提示proj/src
。
我从另一篇文章中发现了以下或多或少有效的内容:
PS1="${PWD#"${PWD%/*/*}/"} $ "
但是,当我将其添加到.bashrc
脚本并创建新 shell 时,/home/user $
无论我位于哪个目录,它都会显示。如果我更改目录,提示符会正确更新。
有没有办法将我的命令行提示符设置为仅显示当前目录和父目录并使其更新而无需更改目录?
与其他情况不同,您必须使用单引号进行外部扩展,并将其按字面意思放入变量中,因为 Bash 稍后会在每次显示提示时进行第二次扩展。
使用双引号时,该值会在赋值时扩展一次,仅此而已。
要实现 shell 提示符的动态更新,以在每个新 shell 会话中显示当前目录名称和父目录名称,而无需更改目录,您可以在您的文件中使用一个小脚本来
.bashrc
设置PS1
变量。当前方法的问题在于,它PS1
在 source 时设置为扩展的结果,但此后.bashrc
它不会动态更新,除非目录发生变化。PS1
为了确保
PS1
每个命令都能动态更新,您可以使用 shell 函数PS1
在显示提示符之前重新计算。Bash 通过环境变量为此提供了一种机制PROMPT_COMMAND
。该变量可以设置为在显示每个提示之前执行的命令。您可以这样做:
以下是该脚本功能的详细说明:
PS1
相应设置。PROMPT_COMMAND
在显示每个提示之前调用此函数。这样,PS1
在显示提示之前会重新计算,准确反映当前目录和父目录。要使用此脚本:
.bashrc
在您最喜欢的文本编辑器中打开您的文件。例如,您可以使用nano ~/.bashrc
或vim ~/.bashrc
。.bashrc
文件中。.bashrc
通过运行 source 来获取文件~/.bashrc
。现在,您的命令提示符应该在每个新的命令行提示符中动态显示当前目录名称和父目录名称,即使在新的 shell 会话中也能正确更新,而无需先更改目录。