为什么不是';我的bash提示符是否正确转义?

为什么不是';我的bash提示符是否正确转义?,bash,command-prompt,Bash,Command Prompt,我在.basrhc文件中定义了以下bash prompt变量: PS1='\u@\h:\[\e[01;34m\]\[$(pwd | sed-e“s.*/\([^/*/[^/]*/[^/]*//]*\\)!\\1!g“\]\[\e[00m\]\[\e[01;31m\]\t\[\e[00m\]\\$” 从目录/one/two/three/four/,这看起来像是一个彩色版本的: me@my-计算机二/三/四12:01:37$ (我不想对我得到的东西有一个印象,但我是一个没有代表点的新手.) 我的问题

我在.basrhc文件中定义了以下bash prompt变量:

PS1='\u@\h:\[\e[01;34m\]\[$(pwd | sed-e“s.*/\([^/*/[^/]*/[^/]*//]*\\)!\\1!g“\]\[\e[00m\]\[\e[01;31m\]\t\[\e[00m\]\\$”

从目录/one/two/three/four/,这看起来像是一个彩色版本的:

me@my-计算机二/三/四12:01:37$

(我不想对我得到的东西有一个印象,但我是一个没有代表点的新手.)

我的问题是没有正确地转义(我认为这是源代码),因为在向上滚动我的历史记录时,行截断了bash提示符,并且终端没有在命令行的正确位置显示光标。在看到这种效果之前,您可能需要向上滚动几行

我认为问题在于
sed
命令,但如果这是正确的,我不确定如何解决它。

有什么想法吗?

在sed命令中,单引号和一点简单的正则表达式似乎可以工作。提示和颜色的东西我不知道,希望这有帮助

sed 's!..*/\(.*/.*/.*\)!\1!g'

您可能需要设置
PROMPT\u DIRTRIM
的值。它的工作原理与您想要的略有不同,但可能已经足够接近了,它内置于
bash
,而且使用起来更简单。(注意:
PROMPT\u DIRTRIM
bash
4.x的新功能(至少4.1,可能是4.0))

您还可以使用
PROMPT\u命令
变量,通过将提示符分解为可管理的步骤来简单地创建提示符。如果
PROMPT\u DIRTRIM
不可用或不符合您的喜好,这将适用于早期版本的
bash

prompt_cmd () {
    # Trim leading directories off the current working directory.
    # Use single quotes so you don't need to escape the backslashes.
    trimmed_pwd=$( pwd | sed -e 's!.*/\([^/]*/[^/]*/[^/]*\)!\1!g' )

    # The initial part of your prompt
    PS1='\u@\h:\[\e[01;34m\] '
    # Add the directory; no single quotes, so the parameter expands, and
    # no need to wrap it in \[ \]
    PS1+=$trimmed_pwd
    # And the final part of your prompt
    PS1+='\[\e[00m\] \[\e[1;31m\]\t\[\e[00m\]\$ '
}
PROMPT_COMMAND='prompt_cmd'

我使用的是Bash4.1,您的
提示符\u DIRTRIM=3
解决方案似乎运行良好,只是在修剪更高的目录时引入了3个句号和斜杠,给出:
me@my-计算机2/3/4 12:01:37$
。有办法改变吗?另外,我认为在第二个解决方案中,您的最终颜色逃逸缺少一个“m”so生成的文本颜色与时间相同。不过回答得很好,谢谢!我没有意识到这一点;这是我(间接地)所做的当我说它的工作方式不同时提到。如果你不喜欢
,我会尝试对原始代码使用
PROMPT\u命令
方法。我会解决转义码问题:)好的,第二种解决方案是。谢谢!实际上,我认为在最后的颜色转义中还有一个额外的反斜杠。我试图编辑它,但我需要至少更改6个字符。感谢对正则表达式的建议。我最初有单引号,但整个
PS1
变量似乎需要单引号,所以我认为我不能嵌套它们。如果它们包含在
$(…)
中,这是否意味着它们没有嵌套?
prompt_cmd () {
    # Trim leading directories off the current working directory.
    # Use single quotes so you don't need to escape the backslashes.
    trimmed_pwd=$( pwd | sed -e 's!.*/\([^/]*/[^/]*/[^/]*\)!\1!g' )

    # The initial part of your prompt
    PS1='\u@\h:\[\e[01;34m\] '
    # Add the directory; no single quotes, so the parameter expands, and
    # no need to wrap it in \[ \]
    PS1+=$trimmed_pwd
    # And the final part of your prompt
    PS1+='\[\e[00m\] \[\e[1;31m\]\t\[\e[00m\]\$ '
}
PROMPT_COMMAND='prompt_cmd'