Cómo usar su archivo .bashrc para hacer el doble con la mitad de las pulsaciones de teclas

En mi publicación reciente sobre la configuración de Ubuntu con scripts Bash, aludí brevemente a la magia de .bashrc. Esto realmente no le hizo justicia, así que aquí hay una publicación rápida que ofrece un poco más de detalles sobre lo que puede hacer el archivo de configuración de Bash.

Mi configuración actual mejora enormemente mi flujo de trabajo y me ahorra más del 50% de las pulsaciones de teclas que tendría que emplear sin ella. Veamos algunos ejemplos de alias, funciones y configuraciones de mensajes que pueden mejorar nuestro flujo de trabajo ayudándonos a ser más eficientes con menos pulsaciones de teclas.

Bash alias

Una escritura inteligente .bashrcpuede ahorrar muchas pulsaciones de teclas. Podemos aprovechar esto en el sentido literal utilizando alias de bash o cadenas que se expanden a comandos más grandes. Para un ejemplo indicativo, aquí hay un alias de Bash para copiar archivos en la terminal:

# Always copy contents of directories (r)ecursively and explain (v) what was done alias cp="cp -rv"

El aliascomando define la cadena que escribiremos, seguida de a qué se expandirá esa cadena. Podemos anular los comandos existentes como el cpanterior. Por sí solo, el cpcomando solo copiará archivos, no directorios, y funciona de manera silenciosa. Con este alias, no tenemos que recordar a pasar esos dos banderas, ni cdo lsla ubicación de nuestro archivo copiado a confirmar que es allí! Ahora, solo esas dos pulsaciones de teclas (para cy d) harán todo eso por nosotros.

Aquí hay algunos .bashrcalias más para pasar banderas con funciones comunes.

# List contents with colors for file types, (A)lmost all hidden files (without . and ..), in (C)olumns, with class indicators (F) alias ls="ls --color=auto -ACF" # List contents with colors for file types, (a)ll hidden entries (including . and ..), use (l)ong listing format, with class indicators (F) alias ll="ls --color=auto -alF" # Explain (v) what was done when moving a file alias mv="mv -v" # Create any non-existent (p)arent directories and explain (v) what was done alias mkdir="mkdir -pv" # Always try to (c)ontinue getting a partially-downloaded file alias wget="wget -c"

Los alias también son útiles cuando queremos evitar escribir comandos largos. Aquí hay algunos que uso cuando trabajo con entornos de Python:

alias pym="python3 manage.py" alias mkenv="python3 -m venv env" alias startenv="source env/bin/activate && which python3" alias stopenv="deactivate"

Para obtener más inspiración sobre las formas en que los alias de Bash pueden ahorrar tiempo, recomiendo encarecidamente los ejemplos de este artículo.

Funciones Bash

Una desventaja de los alias anteriores es que son bastante estáticos: siempre se expandirán exactamente al texto declarado. Para un alias de Bash que toma argumentos, necesitaremos crear una función. Podemos hacer esto así:

# Show contents of the directory after changing to it function cd () { builtin cd "$1" ls -ACF }

No puedo empezar a contar cuántas veces he escrito cde lsinmediatamente después para ver el contenido del directorio en el que estoy ahora. Con esta función configurada, ¡todo sucede solo con esas dos letras! La función toma el primer argumento,, $1como la ubicación para cambiar el directorio, luego imprime el contenido de ese directorio en columnas con un formato agradable con indicadores de tipo de archivo. La builtinparte es necesaria para que Bash nos permita anular este comando predeterminado.

Las funciones Bash también son muy útiles cuando se trata de descargar o actualizar software. Anteriormente, pasaba al menos unos minutos cada dos semanas descargando la nueva versión extendida del generador de sitios estáticos Hugo, gracias a su excelente frecuencia de envío. Con una función, solo necesito pasar la versión y la actualización ocurre en unos segundos.

# Hugo install or upgrade function gethugo () { wget -q -P tmp/ //github.com/gohugoio/hugo/releases/download/v"[email protected]"/hugo_extended_"[email protected]"_Linux-64bit.tar.gz tar xf tmp/hugo_extended_"[email protected]"_Linux-64bit.tar.gz -C tmp/ sudo mv -f tmp/hugo /usr/local/bin/ rm -rf tmp/ hugo version }

La [email protected]notación simplemente toma todos los argumentos dados, reemplazando su lugar en la función. Para ejecutar la función anterior y descargar Hugo versión 0.57.2, usamos el comando gethugo 0.57.2.

También tengo uno para Golang:

function getgolang () { sudo rm -rf /usr/local/go wget -q -P tmp/ //dl.google.com/go/go"[email protected]".linux-amd64.tar.gz sudo tar -C /usr/local -xzf tmp/go"[email protected]".linux-amd64.tar.gz rm -rf tmp/ go version }

¿O qué tal una función que agrega una URL de origen remoto para GitLab al repositorio actual?

function glab () { git remote set-url origin --add [email protected]:"[email protected]"/"${PWD##*/}".git git remote -v }

Con glab username, podemos crear una nueva originURL para el repositorio actual de Git con nuestro usernameen GitLab.com. Enviar a una nueva URL remota crea automáticamente un nuevo repositorio privado de GitLab, por lo que este es un atajo útil para crear copias de seguridad.

Las funciones de bash están realmente limitadas solo por las posibilidades de scripting, de las cuales existen, prácticamente, pocos límites. Si hay algo que hacemos con frecuencia que requiere escribir algunas líneas en una terminal, ¡probablemente podamos crear una función Bash para ello!

Indicador de Bash

Además del contenido del directorio, también es útil ver la ruta completa del directorio en el que estamos. El indicador de Bash puede mostrarnos esta ruta, junto con otra información útil como nuestra rama actual de Git. Para hacerlo más legible, podemos definir colores para cada parte del mensaje. Así es como podemos configurar nuestro mensaje .bashrcpara lograr esto:

# Colour codes are cumbersome, so let's name them txtcyn="\[\e[0;96m\]" # Cyan txtpur="\[\e[0;35m\]" # Purple txtwht="\[\e[0;37m\]" # White txtrst="\[\e[0m\]" # Text Reset # Which (C)olour for what part of the prompt? pathC="${txtcyn}" gitC="${txtpur}" pointerC="${txtwht}" normalC="${txtrst}" # Get the name of our branch and put parenthesis around it gitBranch()  sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'  # Build the prompt export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "

Resultado:

~/github/myrepo (master) $

Nombrar los colores ayuda a identificar fácilmente dónde comienza y termina un color, y dónde comienza el siguiente. El indicador que vemos en nuestra terminal está definido por la siguiente cadena export PS1, con cada componente del indicador configurado con una secuencia de escape. Analicemos eso:

  • \w muestra el directorio de trabajo actual,
  • \$(gitBranch)llama a la gitBranchfunción definida anteriormente, que muestra la rama actual de Git,
  • \$ mostrará un "$" si es un usuario normal o en modo de usuario normal, y un "#" si es root.

La lista completa de secuencias de escape de Bash puede ayudarnos a mostrar muchos más bits de información, ¡incluso la hora y la fecha! Las indicaciones de Bash son altamente personalizables e individuales, así que siéntete libre de configurarlas como quieras.

A continuación, presentamos algunas opciones que ponen la información en primer plano y pueden ayudarnos a trabajar de manera más eficiente.

Para los reacios a la procrastinación

Nombre de usuario y hora actual con segundos, en formato 24 horas HH: MM: SS:

export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >

Para aquellos a los que siempre les gusta saber cuál es su posición

Ruta completa del archivo en una línea separada y nombre de usuario:

export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo user: 

Para los minimalistas

export PS1=">"
>

We can build many practical prompts with just the basic escape sequences; once we start to integrate functions with prompts, as in the Git branch example, things can get really complicated. Whether this amount of complication is an addition or a detriment to your productivity, only you can know for sure!

Many fancy Bash prompts are possible with programs readily available with a quick search. I’ve intentionally not provided samples here because, well, if you can tend to get as excited about this stuff as I can, it might be a couple hours before you get back to what you were doing before you started reading this post, and I just can’t have that on my conscience. ?

We’ve hopefully struck a nice balance now between time invested and usefulness gained from our Bash configuration file! I hope you use your newly-recovered keystroke capacity for good.