Git Bash не распознает команду "Rev" - PullRequest
2 голосов
/ 01 мая 2019

Я пытаюсь использовать функцию, которая сокращает мою подсказку bash.Я добавил его в .bash_profile:

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

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

Но я получаю ошибку bash: rev: command not found каждый раз, когда запускаю git bash.

Я правильно установил PATH, так как другие команды работаютправильно, кроме rev.rev не является частью git bash?Или есть какой-либо другой способ показать только родительский и текущий каталог для приглашения bash?

ОС: Windows 10

Ответы [ 5 ]

5 голосов
/ 01 мая 2019

В вашей среде нет команды rev. Однако вам это не нужно, есть встроенные средства для того, что вы хотите делать.

Чтобы получить текущий рабочий каталог в вашем PS1, используйте \w:

PS1='\w\$ '

Это даст вам полный путь, поэтому ваше приглашение будет выглядеть примерно так:

~/tinker/so/subdir/subsubdir$

Теперь установите для переменной $PROMPT_DIRTRIM количество конечных каталогов, которые необходимо сохранить:

PROMPT_DIRTRIM=2

Вы получите приглашение типа

~/.../subdir/subsubdir$
2 голосов
/ 01 мая 2019

функция около $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
}

Другой особый случай

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
1 голос
/ 01 мая 2019

Это код, который работал для меня -

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

по ссылке ссылка

0 голосов
/ 01 мая 2019

Вы можете просто использовать

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

вместо

0 голосов
/ 01 мая 2019
function last_two_dirs () 
{ 
        awk -F/ '{print ((NF>1)?$(NF-1)"/":"")""$NF}' <<< $PWD
}
...