2 votes

Un grand .bash_profile augmente le temps de travail du terminal. Capable de corriger ?

J'ai un fichier .bash_profile de presque 100 lignes qui fait des choses comme vérifier la branche git et colorer certains textes. Cela rend des choses comme le démarrage d'une nouvelle ligne significativement plus lente par rapport à la vitesse instantanée d'un profil vide.

Y a-t-il un moyen de contourner ce problème ou est-ce simplement à cause de la fonctionnalité supplémentaire du profil qui ajoute des frais généraux ? Pourquoi est-il si lent ?

Après l'avoir testé sur une autre machine (sur une distribution Fedora, j'utilisais un Mac), ce problème ne se pose pas du tout. La machine Fedora est instantanée comme prévu, tandis que le Mac a un retard notable lors du démarrage d'une nouvelle ligne, de la création d'un CD, etc.

Voici le profil : https://pastebin.com/UKWPPqKf

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/home/USRNAME/.sdkman"
[[ -s "/home/USRNAME/.sdkman/bin/sdkman-init.sh" ]] && source "/home/USRNAME/.sdkman/bin/sdkman-init.sh"

#Aliases
if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi

# get current branch in git repo
function parse_git_branch() {
    BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
    if [ ! "${BRANCH}" == "" ]
    then
        STAT=`parse_git_dirty`
        echo "[${BRANCH}${STAT}]"
    else
        echo ""
    fi
}
# get current branch in git repo
function parse_git_branch() {
    BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
    if [ ! "${BRANCH}" == "" ]
    then
        STAT=`parse_git_dirty`
        echo "[${BRANCH}${STAT}]"
    else
        echo ""
    fi
}

# get current status of git repo
function parse_git_dirty {
    status=`git status 2>&1 | tee`
    dirty=`echo -n "${status}" 2> /dev/null | grep "modified:" &> /dev/null; echo "$?"`
    untracked=`echo -n "${status}" 2> /dev/null | grep "Untracked files" &> /dev/null; echo "$?"`
    ahead=`echo -n "${status}" 2> /dev/null | grep "Your branch is ahead of" &> /dev/null; echo "$?"`
    newfile=`echo -n "${status}" 2> /dev/null | grep "new file:" &> /dev/null; echo "$?"`
    renamed=`echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?"`
    deleted=`echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?"`
    bits=''
    if [ "${renamed}" == "0" ]; then
        bits=">${bits}"
    fi
    if [ "${ahead}" == "0" ]; then
        bits="*${bits}"
    fi
    if [ "${newfile}" == "0" ]; then
        bits="+${bits}"
    fi
    if [ "${untracked}" == "0" ]; then
        bits="?${bits}"
    fi
    if [ "${deleted}" == "0" ]; then
        bits="x${bits}"
    fi
    if [ "${dirty}" == "0" ]; then
        bits="!${bits}"
    fi
    if [ ! "${bits}" == "" ]; then
        echo " ${bits}"
    else
        echo ""
    fi
}

export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr0)\]\[\033[38;5;39m\]\w\[$(tput sgr0)\]\[$(tput sgr0)\]\[\033[38;5;15m\] \[$(tput sgr0)\]\[\033[38;5;11m\]\[$(tput bold)\]\`parse_git_branch\`\[\e[m\] \[$(tput sgr0)\]"

3voto

Stefano Palazzo Points 428

Si vous tapez set -x dans le terminal, il imprimera chaque commande qu'il exécute à partir de ce moment, donc pour trouver le coupable, tapez set -x et appuyez sur la touche retour, puis, en faisant attention aux lignes qui défilent à l'écran, recherchez la commande qui prend le plus de temps à s'exécuter.

Le nombre de + au début de chaque ligne vous indiquent la profondeur de l'imbrication de la commande. Si vous faites défiler un peu vers le haut, vous pouvez trouver la commande "parent".

Les commandes que vous voyez lorsque vous appuyez sur retour sont toutes déclenchées par la dernière ligne de votre bashrc, où vous définissez le contenu de la variable PS1 . Chaque fois que vous appuyez sur la touche retour, le contenu de cette variable est exécuté et le résultat est affiché comme "invite" (le bit avant le curseur, par exemple quelque chose comme user@box ~ $ ).

Pour sortir de ce mode, vous pouvez taper set +x ou simplement fermer cette fenêtre/cet onglet du terminal (voir Qu'est-ce que set -x faire ? ).


PS : Je suppose que vos commandes git status ralentissent l'invite. Si vous installez à la fois git y bash-completion de Homebrew, vous pouvez utiliser __git_ps1 pour faire cela et se débarrasser de toutes les fonctions liées à git de votre bashrc. A titre d'exemple, voici à quoi il ressemble sur ma machine :

if [[ -f /usr/local/etc/bash_completion ]]; then
    . /usr/local/etc/bash_completion
fi

GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM="auto"
GIT_PS1_SHOWUNTRACKEDFILES=1

PS1='\w \$ '
if type __git_ps1 &>/dev/null; then
    PS1='\w$(__git_ps1 | sed -e "s/=)$/)/") \$ '
fi

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X