bash 函数环绕 $PWD
在 bash 中,有很多技巧和功能可以让这个过程更快速、更有效率。
仅显示最后两个路径级别:
last_two_dirs() {
local left=${PWD%/*};
echo "${PWD#${left%/*}/}"
}
更复杂的情况:第一和最后一级:
path_parts() {
local APATH
IFS=/ read -a APATH <<<"$PWD"
if ((${#APATH[@]}>3)) ;then
echo "/${APATH[1]}..${APATH[-1]}"
else
echo "$PWD"
fi
}
另一个特殊情况
假设您的路径如下:
/srv/dist/invoices-2019/data-2019-02-10/seq-123
将路径的所有部分裁剪到第一个破折号:
path_dash_Trim () {
local APATH;
IFS=/ read -a APATH <<< "$PWD";
APATH="${APATH[*]#*-}";
echo "${APATH// /\/}"
}
将呈现
/srv/dist/2019/2019-02-10/123
分叉性能问题
为了减少性能问题,有一种适当的方法可以消除分叉(var=$(commnand)
):在函数中设置变量:
只需替换:
echo ${PWD#${left%/*}/}
by
printf -v $1 %s "${PWD#${left%/*}/}"
或者更好的是:
printf -v ${1:-myResult} '%s' "${PWD#${left%/*}/}"
样例:
last_two_dirs() { local left=${PWD%/*};printf -v $1 "%s" "${PWD#${left%/*}/}" ;}
last_two_dirs result
printf -v $1 %s "$result"
或者
path_parts() {
local APATH
IFS=/ read -a APATH <<<"$PWD"
if ((${#APATH[@]}>3)) ;then
printf -v $1 %s "/${APATH[1]}..${APATH[-1]}"
else
printf -v $1 %s "$PWD"
fi
}
and so on...
Then
export -f path_parts
PROMPT_COMMAND='path_parts PS1&&PS1+=" \\$ "'
甚至只是专门的功能:
myPrompt() {
local APATH fmt='%s\[\e];%s\a\] $ '
IFS=/ read -a APATH <<<"$PWD"
if ((${#APATH[@]}>4)) ;then
printf -v PS1 "$fmt" "/${APATH[1]}..${APATH[-2]}/${APATH[-1]}"{,}
else
printf -v PS1 "$fmt" "$PWD"{,}
fi
}
PROMPT_COMMAND=myPrompt
rev
是一个外部命令(单独的可执行文件),不是 shell 本身的一部分;因此它不是任何版本的 bash 的一部分,而是存在于(或不存在于)您的操作系统中,取决于它是否已经被单独安装(或与您的操作系统一起包含等)。 - Charles DuffyPROMPT_COMMAND
钩子,您可以使用它来指定一个函数来更改PS1,如果正确执行将不涉及任何分叉子进程)。 - Charles Duffy\w
和PROMPT_DIRTRIM=2
。 - chepner