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
exporter
votrePS1
. 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
etPROMPT_DIRTRIM = 2
.