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
}
Другой особый случай
Les представьте свой путь в таком виде:
/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%/*}/}
от
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
}
и так далее ...
Тогда
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