2 votos

Un .bash_profile grande que aumenta el tiempo de la terminal para hacer cosas. ¿Se puede arreglar?

Tengo un .bash_profile de casi 100 líneas que hace cosas como comprobar la rama git y colorear cierto texto. Esto hace que cosas como incluso el inicio de una nueva línea sea significativamente más lento en comparación con la velocidad instantánea de tener un perfil vacío.

¿Hay alguna forma de evitar esto o es sólo por la funcionalidad extra que tiene el perfil que está añadiendo sobrecarga? ¿Por qué es tan lento?

Después de probarlo en otra máquina (en una distro Fedora, estaba usando Mac), no tiene este problema en absoluto. La máquina Fedora es instantánea como se esperaba, mientras que el Mac tiene un retraso notable al iniciar una nueva línea, cd'ing en algo, etc.

Aquí está el perfil: 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)\]"

0 votos

¿Hay alguna manera de poner algunos de estos comandos en un archivo script y ejecutarlos por separado en lugar de cada vez que se abre una ventana del shell?

0 votos

Supongo que tendría que saber que está en una carpeta con un repositorio Git, pero no sabría cómo hacerlo. ¿Alguna idea?

0 votos

Podrías poner sentencias echo en tu .bash_profile y ver si uno o unos pocos comandos están tardando mucho en ejecutarse. Tal vez colocar una sentencia echo cada 10 líneas y ver si un conjunto en particular toma mucho tiempo.

3voto

user1650894 Puntos 141

Si escribe set -x en el terminal, imprimirá todos los comandos que ejecute a partir de ese momento, así que para encontrar al culpable, escriba set -x y pulsa "return", luego -prestando atención a las líneas que se desplazan por la pantalla- observa si el comando tarda mucho en ejecutarse.

El número de + al principio de cada línea le indican la profundidad de anidamiento del comando. Si te desplazas un poco hacia arriba, puedes encontrar el comando "padre".

Los comandos que se ven cuando se pulsa return son todos desencadenados por la última línea de su bashrc, donde se establece el contenido de la variable PS1 . Cada vez que se pulsa return, se ejecuta el contenido de esa variable y el resultado se muestra como "prompt" (el bit que precede al cursor, por ejemplo, algo como user@box ~ $ ).

Para salir de este modo, puede escribir set +x o simplemente cerrar esa ventana/pestaña del terminal (ver ¿Qué hace set -x ¿hacer? ).


PD: Me atrevería a decir que tus comandos de estado de git están ralentizando el prompt. Si instalas ambos git y bash-completion de Homebrew, puede utilizar __git_ps1 para hacer esto y deshacerse de todas las funciones relacionadas con git de su bashrc. Como ejemplo, esto es lo que parece en mi máquina:

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X