Bash 中的自定义命令行提示符中显示了错误的路径

Bash 中的自定义命令行提示符中显示了错误的路径

我想在 Linux 命令提示符中显示当前目录和父目录。例如,如果当前目录是/home/user/proj/src,我希望提示符显示proj/src

我发现以下内容来自另一篇文章或多或少有效:

PS1="${PWD#"${PWD%/*/*}/"} $ "

但是,当我将其添加到我的.bashrc脚本并创建一个新的 shell 时,/home/user $无论我在哪个目录中,它都会显示。如果我更改目录,提示会正确更新。

有没有办法将我的命令行提示符设置为仅显示当前目录和父目录并让它更新而无需更改目录?

答案1

为了实现 shell 提示符的动态更新,以便在每个新的 shell 会话中显示当前目录和父目录名称,而无需更改目录,您可以在您的脚本中使用一个.bashrc设置PS1变量的小脚本。您当前方法的问题在于,它PS1在 sourcing 时设置为扩展的结果.bashrc,但此后不会动态更新,PS1除非目录发生变化。

为了确保每条命令都动态更新,您可以使用在显示提示符之前PS1重新计算的 shell 函数。Bash 通过环境变量提供了一种机制。可以将此变量设置为在显示每个提示符之前执行的命令。PS1PROMPT_COMMAND

您可以按照以下方式操作:

prompt_command() {
    # Capture the current working directory
    local cwd="${PWD}"
    # Extract the last two components of the path
    local last_two_dirs="${cwd#"${cwd%/*/*}/"}"
    # Set PS1 with these components
    PS1="${last_two_dirs} $ "
}

# Set PROMPT_COMMAND to call the prompt_command function
PROMPT_COMMAND=prompt_command

以下是此脚本的功能分解:

  • 定义一个函数prompt_command,动态计算当前工作目录的最后两个部分并进行PS1相应的设置。
  • 设置PROMPT_COMMAND为在显示每个提示之前调用此函数。这样,PS1​​在显示提示之前会重新计算,从而准确反映当前目录和父目录。

要使用此脚本:

  1. 在您喜欢的文本编辑器中打开.bashrc文件。例如,您可以使用nano ~/.bashrcvim ~/.bashrc
  2. 将上述脚本复制并粘贴到您的.bashrc文件中。
  3. 保存更改并退出编辑器。
  4. 要将更改应用到当前终端会话,请.bashrc通过运行 source 来获取文件~/.bashrc

现在,您的命令提示符应该在每个新的命令行提示符中动态显示当前目录和父目录名称,即使在新的 shell 会话中也可以正确更新,而无需先更改目录。

答案2

与其他情况不同,你必须使用单身的引号作为外部扩展并将其直接放入变量中,因为 Bash 稍后会在每次显示提示时进行第二次扩展。

使用双引号时,值在分配时扩展一次,仅此而已。

相关内容