GNU/Linux >> Tutoriales Linux >  >> Linux

Lo que un archivo de puntos de shell puede hacer por usted

No te preguntes qué puedes hacer por tu shell dotfile, ¡sino qué puede hacer un shell dotfile por ti!

He estado en todo el mapa de sistemas operativos, pero durante los últimos años mis controladores diarios han sido Mac. Durante mucho tiempo, usé Bash, pero cuando algunos amigos comenzaron a hacer proselitismo con zsh, lo intenté. No tardé mucho en apreciarlo y, varios años después, lo prefiero por muchas de las pequeñas cosas que hace.

He estado usando zsh (proporcionado a través de Homebrew, no el sistema instalado) y la mejora Oh My Zsh.

Los ejemplos de este artículo son para mi .zshrc personal . La mayoría funcionará directamente en Bash, y no creo que ninguno dependa de Oh My Zsh, pero su millaje puede variar. Hubo un período en el que mantenía un archivo de puntos de shell tanto para zsh como para Bash, pero finalmente renuncié a mi .bashrc .

Todos estamos enojados aquí

Si desea tener la posibilidad de usar el mismo archivo de puntos en todos los sistemas operativos, querrá darle un poco de inteligencia a su archivo de puntos.

### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac-specific stuff here.
fi

Por ejemplo, espero que las teclas de flecha Alt + muevan el cursor por palabra en lugar de por un solo espacio. Para que esto suceda en iTerm2 (mi shell preferido), agrego este fragmento a la parte específica de Mac de mi .zshrc:

### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        ### Mac cursor commands for iTerm2; map ctrl+arrows or alt+arrows to fast-move
        bindkey -e
        bindkey '^[[1;9C' forward-word
        bindkey '^[[1;9D' backward-word
        bindkey '\e\e[D' backward-word
        bindkey '\e\e[C' forward-word
fi

¿Qué pasa con Bob?

Si bien llegué a amar mi shell dotfile, no siempre quise tener las mismas cosas disponibles en las máquinas de mi casa que en las de mi trabajo. Una forma de resolver esto es tener archivos de puntos adicionales para usar en casa pero no en el trabajo. Así es como lo logré:

if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
        if [ -e $HOME/.work ]
                source $HOME/.work
        else
                echo "This looks like a work machine, but I can't find the ~/.work file"
        fi
fi

En este caso, elimino el sufijo dns de mi trabajo (o varios sufijos, según su situación) y obtengo un archivo separado que hace que mi vida en el trabajo sea un poco mejor.

Eso que haces

Ahora es probablemente un buen momento para dejar de usar la tilde (~ ) para representar su directorio de inicio al escribir scripts. Descubrirá que hay algunos contextos en los que no se reconoce. Adquirir el hábito de usar la variable de entorno $HOME le ahorrará mucho tiempo para solucionar problemas y dolores de cabeza más adelante.

La extensión lógica sería tener archivos de puntos específicos del sistema operativo para incluir si así lo desea.

Memoria, solo a la luz de la luna

La terminal de Linux

  • Los 7 mejores emuladores de terminal para Linux
  • 10 herramientas de línea de comandos para el análisis de datos en Linux
  • Descargar ahora:hoja de referencia de SSH
  • Hoja de trucos de comandos avanzados de Linux
  • Tutoriales de línea de comandos de Linux

He escrito cantidades vergonzosas de conchas y he llegado a la conclusión de que realmente no quiero escribir más. No es que shell no pueda hacer lo que necesito la mayor parte del tiempo, pero encuentro que si estoy escribiendo shell, probablemente esté juntando una solución de cinta adhesiva en lugar de resolver el problema de forma permanente.

Del mismo modo, odio memorizar cosas y, a lo largo de mi carrera, he tenido que hacer cambios radicales de contexto durante el transcurso del día. La consecuencia práctica es que he tenido que volver a aprender muchas cosas varias veces a lo largo de los años. ("Espera... ¿qué estructura de bucle for usa este lenguaje?")

Entonces, de vez en cuando decido que estoy cansado de buscar cómo hacer algo de nuevo. Una forma de mejorar mi vida es agregar alias.

Un escenario común para cualquiera que trabaje con sistemas es descubrir qué está ocupando todo el disco. Desafortunadamente, nunca pude recordar este conjuro, así que creé un alias de shell, creativo llamado bigdirs :

alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'

Si bien podría ser menos perezoso y realmente memorizarlo, bueno, esa no es la manera de Unix...

Los errores tipográficos y las personas que los aman

Otra forma en que el uso de alias de shell mejora mi vida es salvándome de errores tipográficos. No sé por qué, pero he desarrollado este desagradable hábito de escribir una w después de la secuencia ea , por lo que si quiero borrar mi terminal, a menudo escribiré cleawr . Desafortunadamente, eso no significa nada para mi caparazón. Hasta que agrego esta pequeña pieza de oro:

alias cleawr='clear'

En una instancia en la que Windows tiene un comando equivalente, pero mejor, me encuentro escribiendo cls . Es frustrante ver que tu caparazón levanta las manos, así que agrego:

alias cls='clear'

Sí, conozco ctrl + l , pero nunca lo uso.

Diviértete

El trabajo puede ser estresante. A veces solo necesitas divertirte un poco. Si su shell no conoce el comando que claramente debería simplemente hacer , ¡tal vez quieras encogerte de hombros! Puedes hacer esto con una función:

shrug() { echo "¯\_(ツ)_/¯"; }

Si eso no funciona, tal vez necesites cambiar la mesa:

fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: fsck -y /dev/sdb1 || fliptable

Imagínese mi disgusto y frustración cuando tuve que voltear un escritorio y no podía recordar cómo lo había llamado. Así que agregué algunos alias de shell más:

alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'

Y a veces necesitas celebrar:

disco() {
        echo "(•_•)"
        echo "<)   )╯"
        echo " /    \ "
        echo ""
        echo "\(•_•)"
        echo " (   (>"
        echo " /    \ "
        echo ""
        echo " (•_•)"
        echo "<)   )>"
        echo " /    \ "
}

Por lo general, canalizaré la salida de estos comandos a pbcopy  y péguelo en la herramienta de chat relevante que estoy usando.

Obtuve esta divertida función de una cuenta de Twitter que sigo llamada "Command Line Magic:" @climagic. Como ahora vivo en Florida, estoy muy feliz de que esta sea la única nieve en mi vida:

snow() {
        clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

Diversión con funciones

Hemos visto algunos ejemplos de funciones que uso. Dado que pocos de estos ejemplos requieren un argumento, podrían hacerse como alias. Utilizo funciones por preferencia personal cuando se trata de más de una declaración breve.

En varios momentos de mi carrera, he ejecutado Graphite, una solución de métricas de serie temporal escalable y de código abierto. Ha habido suficientes casos en los que necesitaba transponer una ruta de métrica (delineada con puntos) a una ruta de sistema de archivos (delineada con barras), o viceversa, por lo que resultó útil tener funciones dedicadas para estas tareas:

# Useful for converting between Graphite metrics and file paths
function dottoslash() {
        echo $1 | sed 's/\./\//g'
}
function slashtodot() {
        echo $1 | sed 's/\//\./g'
}

Durante otro momento de mi carrera, estaba ejecutando muchos Kubernetes. Si no está familiarizado con la ejecución de Kubernetes, debe escribir mucho YAML. Desafortunadamente, no es difícil escribir YAML inválido. Peor aún, Kubernetes no valida YAML antes de intentar aplicarlo, por lo que no descubrirá que no es válido hasta que lo aplique. A menos que lo valides primero:

function yamllint() {
        for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}

Debido a que me cansé de avergonzarme y de romper ocasionalmente la configuración de un cliente, escribí este pequeño fragmento y lo agregué como un enlace previo a la confirmación de todos mis repositorios relevantes. Algo similar sería muy útil como parte de su proceso de integración continua, especialmente si trabaja como parte de un equipo.

Oh, dedos, ¿dónde estás?

Una vez fui un excelente mecanógrafo. Esos días han quedado atrás. Escribo más de lo que hubiera creído posible.

En diferentes momentos, he usado una buena cantidad de Chef o Kubernetes. Afortunadamente para mí, nunca usé ambos al mismo tiempo.

Parte del ecosistema Chef es Test Kitchen, un conjunto de herramientas que facilitan las pruebas, que se invoca con los comandos kitchen test . Kubernetes se administra con una herramienta CLI kubectl . Ambos comandos requieren varios subcomandos, y ninguno sale de los dedos con particular fluidez.

En lugar de crear un montón de "alias de errores tipográficos", agregué esos comandos a k :

alias k='kitchen test $@'

o

alias k='kubectl $@'

Divisores de tiempo

La última mitad de mi carrera ha consistido en escribir más código con otras personas. He trabajado en muchos entornos en los que hemos bifurcado copias de repositorios en nuestra cuenta y usamos solicitudes de incorporación de cambios como parte del proceso de revisión. Cuando quiero asegurarme de que mi bifurcación de un repositorio dado esté actualizado con el principal, uso fetchupstream :

alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'

Mis ojos han visto la gloria de la llegada del color

me gusta el color Puede hacer que cosas como las diferencias sean más fáciles de usar.

alias diff='colordiff'

Pensé que las páginas man coloreadas eran un buen truco, así que incorporé esta función:

# Colorized man pages, from:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
        env \
                LESS_TERMCAP_md=$(printf "\e[1;36m") \
                LESS_TERMCAP_me=$(printf "\e[0m") \
                LESS_TERMCAP_se=$(printf "\e[0m") \
                LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
                LESS_TERMCAP_ue=$(printf "\e[0m") \
                LESS_TERMCAP_us=$(printf "\e[1;32m") \
                man "$@"
}

Me encanta el comando which . Simplemente le dice de dónde proviene el comando que está ejecutando en el sistema de archivos, a menos que sea una función de shell. Después de múltiples archivos de puntos en cascada, a veces no está claro dónde se define una función o qué hace. Resulta que el whence y type los comandos pueden ayudar con eso.

# Where is a function defined?
whichfunc() {
        whence -v $1
        type -a $1
}

Conclusión

Espero que este artículo lo ayude y lo inspire a encontrar formas de mejorar su experiencia diaria de uso de Shell. No es necesario que sean enormes, novedosos o complejos. Podrían resolver un problema menor pero frecuente, crear un atajo o incluso ofrecer una solución para reducir los errores tipográficos comunes.

Le invitamos a revisar mi repositorio dotfiles, pero le advierto que podría necesitar mucha limpieza. Siéntase libre de usar cualquier cosa que le resulte útil y, por favor, sea excelente el uno con el otro.


Linux
  1. ¿Cuál es tu shell favorito para el trabajo de administrador de sistemas?

  2. ¿Recursos para la programación de Shell portátil?

  3. ¿Necesita un caparazón para Scp?

  4. ¿Cuál es la ubicación correcta de la variable Shell de PS1?

  5. Linux - ¿Cómo puedo ver lo que está esperando el disco IO?

¿Qué es Subshell en Linux?

¿Qué es Login Shell en Linux?

Los mejores sistemas de comentarios para sitios web que puede hospedar usted mismo

SystemD - ¿Para qué se utiliza SystemD?

Los 5 mejores juegos de ajedrez para Linux que puedes probar en tu tiempo libre

¿Qué es un archivo .sh?