gpt4 book ai didi

Bash 提示符缩短

转载 作者:行者123 更新时间:2023-11-29 09:05:26 25 4
gpt4 key购买 nike

我刚刚从 tcsh 转移到 bash,我特别错过了使用 %c02 的目录缩短提示选项(与 省略号也设置了)。

我看到 PROMPT_DIRTRIM 几乎做了正确的事情(我认为省略号除外),但我只使用 bash 3(在 OS X 上)。我找到了 this recipe elsewhere on SO ,它缩短了总长度,因此在目录中间打断了路径名,这是我不喜欢的。

所以我想到了这个:

PROMPT_DIRTRIM=2   ## from bash4, but used here
dirtrim()
{
local NAME="$1" start= endelts=
[[ "$NAME" =~ ^"$HOME"(/|$) ]] && NAME="~${NAME#$HOME}" ## $HOME ==> ~
IFS=/ read -ra elts <<< "$NAME"; ## split $PWD on "/"
start=$((${#elts[@]}-${PROMPT_DIRTRIM})) ## first element to retain
if [ ${start} -gt 1 ]; then
for ((i=${start}; i<${#elts[@]}; i++)); do
endelts="${endelts}/${elts[$i]}"; ## concat together the trailing path
done
NAME="...${endelts}"
fi
echo "$NAME"
}
PS1='\h:$(dirtrim "$PWD")\$ '

有效:

blackat:~$ cd ~/Library/Application\ Support/Apple
blackat:.../Application Support/Apple$

但我对 bash 还是个新手,对显式的 for (()) 循环不满意;但是,我似乎找不到任何其他方法以正确处理目录名称中的空格的方式重新加入拆分 elts 数组的最后条目(例如,使用 ${elts [@]:${start}}).有任何提示或其他改进吗?

(顺便说一下,我认为这一个编程问题,在某种程度上,bash 是一种编程语言....)

最佳答案

你可以试试这个:

if ((start > 1)); then
name=$(IFS=/; echo .../"${elts[*]:start}")
# If your terminal is correctly set up for unicode, you can save two character positions:
# name=$(IFS=/; echo …/"${elts[*]:start}")
fi

请注意,在 bash 中,在包括 ((...)) 和数组下标内部的算术上下文中,您可以只写变量的名称;不需要印记。

另一种方法是

if ((start > 1)); then
printf -v name "/%s" "${elts[@]:start}"
name=...$name
fi

还有另一种解决方案,在 BASH_REMATCH 数组中使用正则表达式捕获,而不是拆分和重新连接字符串:

dirtrim () { 
local path="$1";
[[ $path =~ ^"$HOME"(/.*)? ]] && path=~${BASH_REMATCH[1]};
((PROMPT_DIRTRIM)) &&
[[ $path =~ ...*((/[^/]*){$PROMPT_DIRTRIM}) ]] &&
path=…${BASH_REMATCH[1]};
echo "$path"
}

((PROMPT_DIRTRIM)) 测试不是完全可靠的,因为 bash 在算术上下文中评估的特殊性。对于分发,您可能更喜欢 [[ $PROMPT_DIRTRIM =~ ^[1-9][0-9]*$ ]]

关于Bash 提示符缩短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com