在 ksh88 上显示 $PS1 中的分支名称

在 ksh88 上显示 $PS1 中的分支名称

我想在 ksh88 的提示中显示我当前的 git 分支。

我正在开发一个遗留项目,后端在 IBM 的 AIX 上运行,并带有强制的 ksh88 shell。对于某些操作,我可以改用 bash,但我不得不使用 ksh88 来完成大部分日常工作。 (我们正在努力改变外壳,但这是一个非常遥远的事情,几乎不可能)

所以我正在使用这种(简化的)变体。它们都可以工作(它们显示当前分支),但没有一个是动态的:如果我切换分支,它们仍然显示相同的分支。

export GIT_BRANCH=$(git branch 2>/dev/null | grep '^*' | colrm 1 2)
export PS1="\$GIT_BRANCH - $ "

get_git_branch(){
    print -- git branch 2>/dev/null | grep '^*' | colrm 1 2
}
export PS1="$(get_git_branch) - $"

在这两种情况下,要更新它,我需要重新加载我的 .profile (正在运行. ~/.profile),但这不切实际。

当我添加 $PWD (在我的完整版本中export PS1)时,当我更改当前目录时它确实会改变

我读过这里(如何设置在每个提示之前运行的命令?)可能有一些技巧可以扩展某些表达式,但仅限于数字表达式。

我见过这个(这是我目前最大的希望) Solaris KSH 使用动态线路设置 PS1但不太明白如何将其应用于我的问题。

还有其他我可以使用的技巧吗?

答案1

做了一些拼图工作。

a) 使用 ksh93

b) 这些别名提供了如何重置(如果您愿意)以在提示符中不包含任何分支信息的想法。

  • 我将以下内容添加到 .profile 中
ENV=~/.kshrc
export ENV
  • 我决定(见上文)将我的别名保留在 .kshrc 中。关键行是:
# alias to reset PS1
alias psr="PS1=$LOGNAME@`hostname`:'\[\${PWD##*/}\]'"
# alias to set PS1 to dynamically check for git branch active, or not
alias psgit="PS1=${LOGNAME}@$(hostname -s)'\[\${PWD##*/}\]{\$(git branch 2>/dev/null| grep \"^*\" | colrm 1 2)}'"

我借用了你的问题!

我的默认 shell 是常规 ksh(88)。登录并切换到更漂亮的 shell 如下所示:

aixtools@x064:[aixtools]aixpb
aixtools@x064:[Playbook]psgit
aixtools@x064[Playbook]{$(git branch 2>/dev/null| grep ^* | colrm 1 2)}export PS1
aixtools@x064[Playbook]{$(git branch 2>/dev/null| grep ^* | colrm 1 2)}ksh93
aixtools@x064[Playbook]{master}
aixtools@x064[Playbook]{master}git checkout aixpb_main00
Updating files: 100% (44/44), done.
Switched to branch 'aixpb_main00'
Your branch is up to date with 'aixtools/aixpb_main00'.
aixtools@x064[Playbook]{aixpb_main00}cd
aixtools@x064[aixtools]{}

有一个拼写错误(缺少“:”) - 但您可以修复,因为很多 PS1 都是非常个人化的。

希望这可以帮助!

相关内容