缩短 Shell 中 primary prompt string
在进入 container 终端进行命令行测试,由于目录太深,左边的路径占满了整个屏幕,右侧可打字的空间就特别的小,因此个人经过几天的实验,大概保留最后两级目录,是比较舒适的,同时也大概知道所在的文件层级。当我们需要完整路径时,随时可以用 pwd
得到。
命令
最简单的方案
PS1='$USER@\w \$ '; PROMPT_DIRTRIM=2
其中 \w
表示当前的工作目录,\$
则表示当前的权限状态,即普通用户态。PROMPT_DIRTRIM
说明去掉 parents 目录,但保留最后两级,而 trim 掉的中间目录以 ...
代替。
效果如下:
# old
(base) muwaii@dell-PowerEdge-T640:~/.cache/pip/http/e/7/9/8/4$ PS1='\w \$ '; PROMPT_DIRTRIM=2
muwaii@~/.../8/4 $
muwaii@~/.../8/4 $pwd
/home/muwaii/.cache/pip/http/e/7/9/8/4
替代法
PS1='${PWD#"${PWD%/*/*}/"} \$ '
让我们一步步分解:
# 先定义去掉后两级目录的当前工作目录,赋值为 TRIM_TWO_PARENTS
root@dell-7920-tower:/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app# TRIM_TWO_PARENTS="${PWD%/*/*}"
root@dell-7920-tower:/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app# echo $TRIM_TWO_PARENTS
/opt/nvidia/deepstream/deepstream-6.2/samples
# 再用 TRIM_TWO_PARENTS 去替换原来的 PWD,那么得到就是原来后两级目录
root@dell-7920-tower:/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app# echo ${PWD#"$TRIM_TWO_PARENTS"} \$
/configs/deepstream-app $
# escape double quote characters and keep tail space
# 接着我们在 echo 命令中,对双引号进行转译,并保留最后的空格。因为 bash 本身解释器是将 '' 视作字面量,所以用双引号。
root@dell-7920-tower:/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app# echo "${PWD#\"${PWD%/*/*}/\"} \$ "
/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app $
root@dell-7920-tower:/opt/nvidia/deepstream/deepstream-6.2/samples/configs/deepstream-app# PS1='${PWD#"${PWD%/*/*}/"} \$ '
# 替换完成
configs/deepstream-app #
PS1
: 是一个特殊的 shell 变量,它保存的是 shell 用来指示它已准备好接受用户输入的提示字符串。${PWD}
: 保存当前工作目录的 shell 变量。"${PWD%/*/*}/"
: 是一个参数扩展,从存储在$PWD
变量中的路径中删除两个父目录,并添加一个尾部斜线。"${PWD#..."}
: 使用上一步的结果,替换原来的$PWD
,得到的就是最后两级目录。\$
: 最末尾显示为美元符号$
,这通常用于表示正常的用户外壳提示。
将所有步骤串联起来,该命令设置shell提示字符串,以显示相对于两个父目录的当前工作目录,并在最后显示一个$
符号。例如,如果当前工作目录是/home/user/project1/src/
,提示符将被设置为project1/src $
。