Bash 提示:如何获取目录路径的首字母

Bash 提示:如何获取目录路径的首字母

我的 bash 提示符 ( ) 中通常只有当前目录的名称PS1='\u@\h:\W$ ',因此如果我进入,~/projects/superapp/src/我会得到:

hamish@host:src$ 

但是我希望在没有完整路径的情况下指示完整路径。我见过一些截图,人们会

hamish@host:~/p/s/src$ 

如果在上面的示例目录中。那么 PS1 的什么值会产生这种情况?或者如果做不到这一点,我需要在我的脚本中编写什么脚本.bashrc来生成这种情况?

答案1

好的,我很好奇,所以这里有一个解决方案:

  1. 首先,创建一个函数,稍微调整一下William Pursell 的回答那么问题来了我在上面的评论中进行了链接。
  2. 接下来,将其放入 $PS1 中的\$(function_name)适当位置。

举个例子:

short_pwd() {
    cwd=$(pwd | perl -F/ -ane 'print join( "/", map { $i++ < @F - 1 ?  substr $_,0,1 : $_ } @F)')
    echo -n $cwd
}
# later in your .bashrc
PS1="\u \$(short_pwd) \$ "

我希望有比我更熟练的 Bash 脚本编写者可以提出一些清理该函数的方法,但这应该能让您了解如何在提示符中使用另一个命令(或 Bash 函数)的输出。另请参阅此处:http://www.linux.org/docs/ldp/howto/Bash-Prompt-HOWTO/x279.html

根据您的评论,我再次查看并意识到我的解决方案需要双引号。如果您对这样的函数进行单引号处理,那么它根本不起作用。

答案2

我喜欢 meowsqueak 的方法,尝试留在 bash 中以提高性能。但我希望我的路径将长目录名缩短为一个字符。

me@comp:~ $ cd my/path/haslongnames/
me@comp:~my/p/h $

这是基于 meowsqueak 的解决方案。它还可以进行一些改进/增加更多功能,但它无需启动 sed 即可解决基本问题。

它位于可执行文件中,例如 ~/bin/ps1

# set this to whatever you want:
MAX_PWD_LENGTH=30
function shorten_pwd
{
    # This function ensures that the PWD string does not exceed $MAX_PWD_LENGTH characters
    PWD=$(pwd)

    # determine part of path within HOME, or entire path if not in HOME
    RESIDUAL=${PWD#$HOME}

    # compare RESIDUAL with PWD to determine whether we are in HOME or not
    if [ X"$RESIDUAL" != X"$PWD" ]
    then
        PREFIX="~"
    fi

    # check if residual path needs truncating to keep total length below MAX_PWD_LENGTH
    NORMAL=${PREFIX}${RESIDUAL}
    if [ ${#NORMAL} -ge $(($MAX_PWD_LENGTH)) ]
    then
        newPWD=${PREFIX}
        OIFS=$IFS
        IFS='/'
        bits=$RESIDUAL
        for x in $bits
        do
            if [ ${#x} -ge 3 ]
            then
                NEXT="/${x:0:1}"
            else
                NEXT="$x"
            fi
            newPWD="$newPWD$NEXT"
        done

        IFS=$OIFS
    else
        newPWD=${PREFIX}${RESIDUAL}
    fi

    # return to caller
    echo $newPWD
}
export PS1="\u@\h:$(shorten_pwd) $ "

在我的 .bash_profile 中我有

PROMPT_COMMAND="source $HOME/bin/ps1"

答案3

PROMPT_DIRTRIM=3

将强制 \w 扩展为当前工作目录路径的最多三个尾随元素,如果有的话,则将前面的元素替换为“...”。

答案4

我最近重写了这个脚本,基于我几年前写的另一个脚本 - 这个脚本经过优化,尽可能在 bash 中运行,以避免昂贵的 fork。它比我以前使用 awk/sed 的函数快了近 8 倍。

它确实产生了不错的结果。它将提示的 pwd 部分保持在不超过 MAX_PWD_LENGTH 个字符,并且如果您在 $HOME 的子目录中,它也会清楚地显示这一点:

例子:

pc770-ubu:~ $ cd ~/a/b/c
pc770-ubu:~/a/b/c $ cd d/e/f
pc770-ubu:~/a/b/c/d/e/f $ cd g
pc770-ubu:~/a/b/c/d/e/f/g $ cd h
pc770-ubu:~/a/b/c/d/e/f/g/h $ cd i
pc770-ubu:~/a/b/c/d/e/f/g/h/i $ cd j
pc770-ubu:~/a/b/c/d/e/f/g/h/i/j $ cd k
pc770-ubu:~/a/b/c/d/e/f/g/h/i/j/k $ cd l
pc770-ubu:~../c/d/e/f/g/h/i/j/k/l $ cd m
pc770-ubu:~../d/e/f/g/h/i/j/k/l/m $ cd n
pc770-ubu:~../e/f/g/h/i/j/k/l/m/n $ cd o
pc770-ubu:~../f/g/h/i/j/k/l/m/n/o $ cd /tmp/a/b/c/d/e/f
pc770-ubu:/tmp/a/b/c/d/e/f $ cd g
pc770-ubu:/tmp/a/b/c/d/e/f/g $ cd h
pc770-ubu:/tmp/a/b/c/d/e/f/g/h $ cd i
pc770-ubu:/tmp/a/b/c/d/e/f/g/h/i $ cd j
pc770-ubu:/../a/b/c/d/e/f/g/h/i/j $ cd k
pc770-ubu:/../b/c/d/e/f/g/h/i/j/k $ cd l
pc770-ubu:/../c/d/e/f/g/h/i/j/k/l $ cd m
pc770-ubu:/../d/e/f/g/h/i/j/k/l/m $ cd
pc770-ubu:~ $ 

bash 函数(构造 PS1 变量时调用此函数):

# set this to whatever you want:
MAX_PWD_LENGTH=20

function shorten_pwd
{
    # This function ensures that the PWD string does not exceed $MAX_PWD_LENGTH characters
    PWD=$(pwd)

    # if truncated, replace truncated part with this string:
    REPLACE="/.."

    # determine part of path within HOME, or entire path if not in HOME
    RESIDUAL=${PWD#$HOME}

    # compare RESIDUAL with PWD to determine whether we are in HOME or not
    if [ X"$RESIDUAL" != X"$PWD" ]
    then
        PREFIX="~"
    fi

    # check if residual path needs truncating to keep total length below MAX_PWD_LENGTH
    # compensate for replacement string.
    TRUNC_LENGTH=$(($MAX_PWD_LENGTH - ${#PREFIX} - ${#REPLACE} - 1))
    NORMAL=${PREFIX}${RESIDUAL}
    if [ ${#NORMAL} -ge $(($MAX_PWD_LENGTH)) ]
    then
        newPWD=${PREFIX}${REPLACE}${RESIDUAL:((${#RESIDUAL} - $TRUNC_LENGTH)):$TRUNC_LENGTH}
    else
        newPWD=${PREFIX}${RESIDUAL}
    fi

    # return to caller
    echo $newPWD
}

编辑:修复绝对字符串长度的错误

相关内容