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
5 Réponses :
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\$ '
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 .
Fonction
$ PWD Sous bash , il il y a beaucoup d'astuces et de fonctionnalités que vous pourriez utiliser pour rendre cela beaucoup plus rapide et efficace
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
export -f path_parts PROMPT_COMMAND='path_parts PS1&&PS1+=" \\$ "'
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%/*}/}"
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
Remarque: je n'ai publié ceci qu'après avoir commenté $ DIRTRIM sur la réponse de Benjamin W.
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
Pensez à utiliser une fonction au lieu d'un script dans une variable! Voir ma réponse
function last_two_dirs ()
{
awk -F/ '{print ((NF>1)?$(NF-1)"/":"")""$NF}' <<< $PWD
}
Vous pouvez simplement utiliser
pwd | sed -r 's|.*/([^/]+/[^/]+)$|\1|'
à la place
Remarque: vous ne devez pas
exportervotrePS1. Il est censé être défini uniquement pour les shells interactifs et irait généralement dans~ / .bashrc.revest 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_COMMANDque 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
\ wetPROMPT_DIRTRIM = 2.