【发布时间】:2026-01-04 08:55:01
【问题描述】:
我知道我可以这样做以仅反映 PS1 值中的最后 2 个目录。
PS1=${PWD#"${PWD%/*/*}/"}#
但是假设我们有一个非常混乱的目录名称,并且会减少我的工作空间,比如
T-Mob/2021-07-23--07-48-49_xperia-build-20191119010027#
或
2021-07-23--07-48-49_nokia-build-20191119010027/T-Mob#
那些是prompt之前的最后两个目录
我想设置一个条件 如果最后 2 个目录中的任何一个的目录长度超过阈值,例如10 个字符,长度超过 10 的目录的第一个 3 和最后 3 个字符缩短名称 例如
2021-07-23--07-48-49_xperia-build-20191119010027 &
2021-07-23--07-48-49_nokia-build-20191119010027
gt 10 将分别缩短为 202*027 和 PS1
T-Mob/202*027/# for T-Mob/2021-07-23--07-48-49_xperia-build-20191119010027# 和
202*027/T-Mob# for 2021-07-23--07-48-49_nokia-build-20191119010027/T-Mob#
一个快速的 1 Liner 来完成这项工作?
我不能在 cmets 中发布这个,所以在这里更新。参考华金回答 (thx J)
PS1=''`echo ${PWD#"${PWD%/*/*}/"} | awk -v RS='/' 'length() <=10{printf $0"/"}; length()>10{printf "%s*%s/", substr($0,1,3), substr($0,length()-2,3)};'| tr -d "\n"; echo "#"`''
见下文 o/p's
/root/my-applications/bin # it shortened as expected
my-*ons/bin/#cd - # going back to prev.
/root
my-*ons/bin/# #value of prompt is the same but I am in /root
【问题讨论】:
-
你为什么要一个班轮?可读性(以及扩展性,可维护性)不是比简洁更重要吗?
-
另外,不要用
awk或sed标记您的问题,除非您的问题是关于awk或sed。如果您只是认为这些是某人可能用于构建答案的工具,那么您的问题不是关于这些工具——如果您想要使用标准 UNIX 工具的答案,请标记unix。就是说,对于诸如打印提示之类的事情——在调用之间的时间很短的情况下一遍又一遍地发生——你不想纯粹出于性能原因使用外部命令(awk 和 sed 都是);生成子进程是 shell 可以做的最慢的事情之一。 -
@user1874594:我建议您编写一个生成目录字符串的函数,并在您的
PS1中使用此函数。这更容易调试和维护。 -
@user1934428,通过命令替换在 PS1 中使用函数需要分叉子外壳。它比在
PROMPT_COMMAND中执行分配要慢(当然,假设您的PROMPT_COMMAND代码是为了避免使用子shell 而编写的)。 -
@CharlesDuffy:正确,但由于此功能仅在打印提示时执行(即在用户交互的时间范围内),至少子进程的创建不是我担心的事情。