无法获得我想要的确切bash提示

时间:2018-01-04 18:31:37

标签: bash

什么让我失望主要是试图获得我想要的新线条。相信我,我已经在谷歌搜索并搜索了这个网站,但无法得到我想要的。我要么解析错误,要么得到我想要的错误。

我想要的是这个

for (let val of await gen()) {
  ...
}

第一行绿色,第二个黄色,第三个白色。我能想到的东西给了我这个:

/c/what/ever/folder/here
(gitbranch)
$ STARTTYPING HERE

注意(gitbranch)之前的额外空格以及“$”

之前缺少换行符

到目前为止,这是我的PS1:

/c/what/ever/folder/here
 (gitbranch) $ STARTTYPING HERE

我想要这个,因为我们有时会有很长的分支和目录名称而且讨厌让我的提示从任何地方开始,但是在最左边

1 个答案:

答案 0 :(得分:1)

我认为涉及sed会产生一些输出,这些输出实际上会混淆您用于PS1的双引号字符串中的扩展。

如果您愿意,可以切换到拼接特殊字符串,单引号字符串和双引号字符串(例如"$foo"'"not $expanded'$'\n'),但这有点令人困惑。

相反,为什么不跳过解析git branch的输出,只是直接询问分支?

假设您希望分支名称(第二行)在不在Git存储库中时不显示 ,则可行:

branch=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
PS1="\[\033[32m\]\w${branch:+\[\033[33m\]\n($branch)}\[\033[00m\]\n$ "

魔法在:+ parameter expansion语句中:如果左侧非空,它会分配/返回加号右侧的所有内容;没有其他的。可以把它想象成其他编程语言中的$cond ? $trueval : $falseval三元运算符。

如果您想要一个默认字符串而不是第二行,请尝试:

PS1="\[\033[32m\]\w\[\033[33m\]\n(${branch:-no branch detected})\[\033[00m\]\n$ "

如果您使用的是全新的仓库,但尚未提交任何内容,则该代码会提示您位于分支机构HEAD中。如果您想要master或其他内容,请执行以下操作:

branch=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
if [ "$branch" = "HEAD" ]; then
    branch="master, brand new"
fi

您可能已经这样做了,但如果您希望在更改目录时提示更新,则运行该代码一次将无效;无论你第一次运行它的git分支,它都会“坚持”。要实现这一点,请通过函数将该代码插入PROMPT_COMMAND bash变量,如下所示:

prompt_with_git() {
    branch=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
    PS1="\[\033[32m\]\w${branch:+\[\033[33m\]\n($branch)}\[\033[00m\]\n$ "
}

PROMPT_COMMAND=prompt_with_git

一旦你source,那就应该有用了。

请注意,这需要一个支持此处使用的rev-parse命令和参数的Git。手动执行已提交的仓库文件夹中的git rev-parse --abbrev-ref HEAD以检查您的仓库是否存在;如果有错误,您可能需要升级您的Git。