3
votes

Git bash ne reconnaît pas la commande 'rev'

J'essaye d'utiliser une fonction qui raccourcit mon invite de bash. Je l'ai ajouté dans .bash_profile:

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

export PS1='$(last_two_dirs) $(__git_ps1) âž¡  '

Mais j'obtiens une erreur bash: rev: command not found à chaque fois que je lance git bash .

J'ai correctement défini le PATH car les autres commandes fonctionnent correctement sauf rev . rev ne fait-il pas partie de git bash? Ou existe-t-il un autre moyen d'afficher uniquement le répertoire parent et le répertoire actuel de l'invite bash?

OS: Windows 10


4 commentaires

Remarque: vous ne devez pas exporter votre PS1 . Il est censé être défini uniquement pour les shells interactifs et irait généralement dans ~ / .bashrc .


rev est une commande externe (un exécutable séparé), qui ne fait pas partie du shell lui-même; il ne fait donc pas partie de aucune version de bash, mais quelque chose qui existe (ou pas) selon que vous l'avez installé séparément (ou inclus avec votre système d'exploitation, etc.).


BTW, utiliser des substitutions de commandes dans votre invite est une très mauvaise idée - elles sont lentes , et particulièrement lentes sous Windows. Il est préférable d'utiliser uniquement la logique native du shell (et aucune substitution de commande du tout; bash a un hook PROMPT_COMMAND que vous pouvez utiliser pour spécifier une fonction qui change PS1, qui si elle est bien faite n'impliquera aucun sous-processus de fourche du tout ).


Utilisez \ w et PROMPT_DIRTRIM = 2 .


5 Réponses :


5
votes

Votre environnement ne semble pas avoir la commande rev . Cependant, vous n'en avez pas besoin, il existe des fonctionnalités intégrées pour ce que vous voulez faire.

Pour obtenir le répertoire de travail actuel dans votre PS1 , utilisez \ w :

~/.../subdir/subsubdir$

Cela vous donne le chemin complet, donc votre invite ressemblera à quelque chose comme

PROMPT_DIRTRIM=2

Maintenant, définissez le $ PROMPT_DIRTRIM au nombre de répertoires de fin à conserver:

~/tinker/so/subdir/subsubdir$

Cela vous donnera une invite comme

PS1='\w\$ '


3 commentaires

J'ai envisagé DIRTRIM mais je voulais juste quelque chose de plus minimaliste sans les points et les trucs pour rendre l'invite propre


@FatehAK Pour ma propre invite, je fais quelque chose de similaire: je remplace tous les noms de répertoires mais celui actuel par les trois premiers caractères seulement, donc / chemin / vers / certains / nested / répertoire apparaîtrait comme / pat / to / som / nes / répertoire . J'utilise PROMPT_COMMAND pour créer mon invite, voir .


... semble être un petit prix à payer pour indiquer clairement que vous élidez le répertoire complet et évitez un encombrement supplémentaire dans votre configuration bash .



2
votes

Fonction

autour de $ PWD

Sous , il il y a beaucoup d'astuces et de fonctionnalités que vous pourriez utiliser pour rendre cela beaucoup plus rapide et efficace

Simplement deux derniers niveaux de chemin:

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

Plus complexe: d'abord dernier niveau:

export -f path_parts
PROMPT_COMMAND='path_parts PS1&&PS1+=" \\$ "'

Autre cas particulier

Les imaginez votre chemin dans ce genre:

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
}

Pour découper toute une partie du chemin jusqu'au premier tiret:

last_two_dirs() { local left=${PWD%/*};printf -v $1 "%s" "${PWD#${left%/*}/}" ;}
last_two_dirs result
printf -v $1 %s "$result"

affichera

printf -v ${1:-myResult} '%s' "${PWD#${left%/*}/}"

Problème de performances des fourches

Afin de réduire les problèmes de performances, il existe un moyen approprié d'éliminer les fourchettes ( var = $ (commnand) ): Définissez la variable dans la fonction:

Remplacez simplement

printf -v $1 %s "${PWD#${left%/*}/}"

par

echo ${PWD#${left%/*}/}

ou mieux:

/srv/dist/2019/2019-02-10/123


1 commentaires

Remarque: je n'ai publié ceci qu'après avoir commenté $ DIRTRIM sur la réponse de Benjamin W.



1
votes

C'est le code qui a fonctionné pour moi -

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

référencé depuis lien


1 commentaires

Pensez à utiliser une fonction au lieu d'un script dans une variable! Voir ma réponse



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

0 commentaires

0
votes

Vous pouvez simplement utiliser

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

à la place


0 commentaires