我一直在 Windows 上使用 Git Bash,最近,我有机会尝试 Codespace。我喜欢 Codespace 终端设置非常干净和简单。
打开终端时,没有路径前缀,即在主目录中工作时:
$ write_here
当您进入子目录时,它会从主目录之后的第一个子目录开始写入路径前缀
new/ $ write_here
new/new2/ $ write_here
基本上,它所做的就是从任何目录的完整路径前缀中剥离主目录的路径前缀
我想在我的主要设置上复制这个,但找不到编写脚本的干净方法。
我尝试通过修改 .bashrc 文件来自定义提示。例如,我使用了这两个脚本:
(PS:我的主目录是/e/VScode)
PS1='${PWD#/e/VScode/} $ ' <br/>
PS1='${PWD//\/e\/VScode\//}/ $ '
这两者都完成了一半的工作。它们显示子目录的简化路径,
(例如
new/new2/ $ write_from_here
)/e/VScode/ $ write_here
.
我对社区来说还比较陌生,所以我承认我还不太熟悉所有的脚本约定和技术。但我尝试了一种解决方法,为主目录引入单独的情况:
PS1='$(if [ "$PWD" = "/e/VScode" ]
then
echo "$ ";
else
echo "${PWD#/e/VScode/}/ $ ";
fi)'
当然,结果正是我想要的。
尽管我可以继续使用解决方法,但我仍然对实现这一结果的理想、干净、单例脚本行感到好奇。为什么最初的脚本行对于这种情况不起作用?
这是我个人的解决方案:
#--- prompt
function getPS1path()
{
local p="$PWD"
local len=${#HOME}
(( $len > 3 )) && [[ ${p:0:$len} == $HOME ]] && p="~${p:$len}"
local max="${PS1_MAX_PATH//[!0-9]}"
[[ $max = "" ]] && max=$(( $(stty -a | tr \; '\n' | awk '$1=="columns" {print $2}')/3 ))
(( max < 20 )) && max=20
(( max > 50 )) && max=50
local i x pre=
for (( i=0; i<30; i++ ))
do
len=${#p}
(( len <= max )) && break
x="${p#*/}"
[[ $x = "" || "$x" = "$p" ]] && break
p="$x"
pre=".../"
done
echo -n "$pre$p"
}
[[ $origPS1 = "" ]] && origPS1="$PS1"
newPS1=$'\\[\e[1m\e[31m\\]\\h:$(getPS1path) # \\[\e[m\017\\]'
PS1="$newPS1"