Bash:自定义PS1与nice工作目录路径

我使用Ubuntu和我厌倦了这个长的提示在bash当我使用一些深层目录层次结构。所以,我想调整我的PS1缩短工作目录部分如下:

目前我有:

pajton@dragon:~/workspace/projects/project1/folder1/test$

并希望有:

pajton@dragon:~/workspace/.../folder1/test$

如果len($ PWD)超过给定阈值,则会发生截断。我想始终保留第一个路径组件和至少一个最后一个路径组件。然后当空间允许时,从右边添加更多的组件。

这是我目前的。它工作,但是:1)不保留第一路径分量,2)不尊重切割路径在边界:

pwd_length=14
pwd_symbol="..."
newPWD="${PWD/#$HOME/~}"

if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ]
then
   newPWD="...$(echo -n $PWD | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")"
else
   newPWD="$(echo -n $PWD)"
fi

结果:

pajton@dragon:...sth/folder1/sample$

提前致谢!

考虑这个脚本使用awk而不是sed为你的情况:
pwd_length=14
pwd_symbol="..."
newPWD="${PWD/#$HOME/~}"
if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ]
then
   newPWD=$(echo -n $newPWD | awk -F '/' '{
   print $1 "/" $2 "/.../" $(NF-1) "/" $(NF)}')
fi
PS1='${newPWD}$ '

对于你的目录〜/ workspace / projects / project1 / folder1 / test的例子,它使PS1为:〜/ workspace /…/ folder1 / test

更新

以上解决方案将设置您的提示,但正如你在注释中指出,它将不会改变PS1动态更改目录。所以这里的解决方案将动态设置PS1时,你改变目录。

将这两行放在.bashrc文件中:

export MYPS='$(echo -n "${PWD/#$HOME/~}" | awk -F "/" '"'"'{
if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF;
else if (NF>3) print $1 "/" $2 "/.../" $NF;
else print $1 "/.../" $NF; }
else print $0;}'"'"')'
PS1='$(eval "echo ${MYPS}")$ '

如果awk中的(NF> 4&&< length($ 0)> 14)条件将仅在当前目录超过3个目录深度并且如果$ PWD的长度大于14个字符时应用特殊处理,将PS1保持为$ PWD。

例如:如果当前目录是〜/ workspace / projects / project1 $,那么PS1将是〜/ workspace / projects / project1 $

以上在.bashrc中的效果将如下在你的PS1上:

~$ cd ~/workspace/projects/project1/folder1/test
~/workspace/.../folder1/test$ cd ..
~/workspace/.../project1/folder1$ cd ..
~/workspace/.../project1$ cd ..
~/.../projects$ cd ..
~/workspace$ cd ..
~$

注意当我改变目录时,提示如何改变。让我知道,如果这不是你想要的。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...