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.
0 votos
¿Qué quiere decir con iniciar una nueva línea? ¿Simplemente pulsar Retorno o abrir una nueva pestaña?
0 votos
Además, por favor, céntrate en un tema, que en este caso probablemente sea cómo analizar/resolver las largas esperas. Siempre puedes hacer la pregunta sobre git por separado, idealmente mostrando la forma en que lo haces actualmente como parte de la pregunta.
0 votos
El cartel parece decir que al ejecutar el perfil el terminal se ralentiza. No es que el perfil vaya lento.
1 votos
Por favor, publique su perfil.
0 votos
El perfil se lee una vez por cada inicio del shell, por lo que eso solo no debería importar (mi perfil tiene mucho más de 100 líneas).
0 votos
Sí, pulsar return hace que el terminal sea lento en el sentido de que no mostrará el prefijo (nombre@host, etc.) durante un tiempo considerable.
0 votos
Parece que por cada nuevo aviso que se ejecuta
git
una o dos veces y procesar el resultado con un montón degrep
corre. No me sorprende que esto ralentice los avisos realizados de forma significativa.0 votos
[Por alguna tonta razón @nohillside quiere ignorar otros problemas con el script.] Veo algo de código probablemente no relacionado con MacOS en el script. Ejemplo: export SDKMAN_DIR="/home/USRNAME/.sdkman" Linux utiliza "/home" mientras que MacOS utiliza "/Users". Aunque no se ha probado, export SDKMAN_DIR="${HOME}/.sdkman"
0 votos
@historystamp No es relevante para la pregunta formulada. Y no sabemos si el OP se automonta en
/home
o comparte una.bash_profile
entre Linux y MacOS. En cualquier caso las líneas que enumeras no están relacionadas con la lentitud por la que pregunta el OP.0 votos
Hola @nohillslide Este .bash_profile ya estaba configurado en una máquina Linux y esencialmente copié el archivo a mi Mac. No estoy seguro de la diferencia que hace sin embargo.