Git bash无法识别“ rev”命令

时间:2019-05-01 13:46:55

标签: bash git shell git-bash

我正在尝试使用缩短我的bash提示的功能。我已将其添加到.bash_profile中:

function last_two_dirs {
   pwd |rev| awk -F / '{print $1,$2}' | rev | sed s_\ _/_
}

export PS1='$(last_two_dirs) $(__git_ps1) ➡  '

但是每次我启动git bash时都会出现错误bash: rev: command not found

我已经正确设置了PATH,因为除rev以外的其他命令都可以正常工作。 rev是否不属于git bash?还是有其他方法仅显示bash提示的父目录和当前目录?

操作系统:Windows 10

5 个答案:

答案 0 :(得分:5)

您的环境似乎没有rev命令。但是,您不需要它,内置的功能可满足您的需求。

要在PS1中获得当前的工作目录,请使用\w

PS1='\w\$ '

这将为您提供完整的路径,因此您的提示将类似于

~/tinker/so/subdir/subsubdir$

现在,将$PROMPT_DIRTRIM变量设置为要保留的尾随目录数:

PROMPT_DIRTRIM=2

这将为您提供类似的提示

~/.../subdir/subsubdir$

答案 1 :(得分:2)

函数围绕$PWD

下,您可以使用许多技巧和功能来使此操作更快,更有效

仅是最后两个路径级别:

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%/*}/}

作者

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

答案 2 :(得分:1)

这是对我有用的代码-

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

引自link

答案 3 :(得分:0)

function last_two_dirs () 
{ 
        awk -F/ '{print ((NF>1)?$(NF-1)"/":"")""$NF}' <<< $PWD
}

答案 4 :(得分:0)

您可以简单地使用

pwd | sed -r 's|.*/([^/]+/[^/]+)$|\1|'

代替