Reventando la Terminal

Buenas,

Llevo bastante tiempo investigando formas de disparar mi productividad y aprender sobre cómo funcionan por dentro las herramientas que utilizo (ya sabéis lo que hago con Vim) y hace unos días, cuando leí un post que me pasaron sobre cómo ser un master de la terminal, me di cuenta de que se me ha ido de las manos porque creo que incluso puedo aportarle cosas al artículo.

Lo voy a intentar.

Yo utilizo Bash y mi editor habitual es Vim. A veces, no mucho, uso tmux para multiplexar la terminal pero entre Vim y otros trucos no suelo necesitarlo. Todas mis configuraciones las podéis encontrar en mis dotfiles por lo que no voy a entrar en esas partes, me preguntáis lo que necesitéis saber.

Bien.

Para explotar tu terminal al máximo la tienes que conocer y para eso viene muy bien saber un poco de historia. Me la saltaré, pero la investigáis un poco vosotros (teletipos y esas cosas). Por herencia histórica, casi todos los terminales usan una librería de edición en línea llamada GNU-Readline. Bash no es una excepción, pero quizás otros sí lo sean así que investigáis vuestro caso (Fish y cosas modernas no sé si lo cumplirán).

Empiezo con Readline pero igual es lo más duro, os lo podéis saltar, más abajo os cuento las herramientas que más utilizo y cómo y en el medio hay un pequeño cheatsheet para navegar por ficheros de texto con less o las hojas del manual.

¿Tenéis ganas?


GNU-Readline

GNU-Readline define muchísimos shortcuts. Si os leeis la documentación (man readline) tenéis todos, pero yo os cuento los que más uso. Es posible que a medida que vaya aprendiendo más mis gustos vayan cambiando, os lo diré en el futuro.

Supondré que usáis GNU-Readline en modo Emacs. Sí, soy Vimer, pero el modo Vi no me gusta mucho en este caso porque no aprovecho la potencia de la edición por modos y el número de shortcuts y de maniobras que hay que hacer con los dedos es suficientemente reducido para que usar el modo Emacs no sea insufrible. Este es el truco número 1, probad el modo Vi también.

Voy a daros un poco de información con los hotkeys que uso habitualmente con un truco mnemotécnico entre paréntesis para ayudar (¡si lo tengo!).

Copiar-pegar, insertar, editar

Ctrl-i: autocompleta con las sugerencias posibles. Lo conoces porque lo usas en el Tabulador.
Ctrl-w: borra una palabra hacia la izquierda (word). El contrario es Alt-d pero no lo uso.
Ctrl-u: borra hacia la izquierda hasta llegar al inicio de la línea (se parece a la w, no tengo nada mejor). Muy útil cuando escribimos contraseñas para limpiar el campo entero. El contrario es Ctrl-k.
Ctrl-y: pega lo borrado anteriormente (yank). Alt-y para elegir cosas que has borrado anteriormente.
Ctrl-x Ctrl-u: Deshacer (prefix + undo). También se puede con Ctrl-_.
Ctrl-x Ctrl-e: Editar la línea con el editor por defecto (prefix + editor). Muy útil para cuando nos venimos arriba con la línea y se nos va de las manos o para pegar cosas.

Más abajo os enseño a pegar desde fuera de la terminal

Señales y procesos

Ctrl-c: envía la señal SIGINT al proceso actual, que sirve para pararlo.
Ctrl-z: envía la señal SIGSTP al proceso actual, que lo suspende. Luego jugaremos con él usando jobs, bg, fg y disown (zzz: onomatopeya de dormir).
Ctrl-d: envía EOF (End Of File) a la terminal, lo que te hace salir de ella como si hubieses escrito quit y otras cosas. Es muy útil y funciona en casi todas las terminales del mundo. Si hay texto en la línea borra el carácter.

Recordad también comandos como `kill`, `killall` y `pkill` y  el  `&` para lanzar en background. Más abajo profundizo un poco más.

Saltar por la línea

Pueden usarse las teclas inicio, fin y esas, pero hay otras también:

Ctrl-e: salta al final de la línea (end).
Ctrl-a: salta al inicio de la línea («a» es la primera letra del diccionario).
Ctrl-x Ctrl-x: salta al lugar anterior (la «x» es como una marca de dónde estás y dónde estabas).
Alt-b y Alt-f: saltar una palabra hacia atrás (backward) y hacia delante (forward).

Manipular el historial

Ctrl-s y Ctrl-r: buscar hacia delante (search) y hacia atrás (reverse-search) en el historial. Para ejecutar el comando usar Ctrl-o o simplemente pulsar Enter para seleccionarlo.
Alt-.: inserta el último argumento utilizado.

Las flechas de arriba y abajo también sirven para manipular el historial, hay shortcuts también pero siempre uso las flechas.


Navegación simple por ficheros

Tanto Vim como less (y por tanto las páginas del manual) soportan lo que cuento aquí, uso muchísimas más, pero para navegar por las hojas de manual es suficiente:

/: abre una miniterminal para buscar. /palabra busca la palabra en el texto. Se puede saltar a la siguiente pulsando la letra n (next) e ir hacia atrás con N.

g: Ir al inicio del documento. En Vim hay que pulsarla dos veces porque es un prefijo para otras cosas como gf (go to file).

G: Ir al final del documento.

Ctrl-u y Ctrl-d: (Up y Down) moverse media página hacia arriba o hacia abajo.

Usad la ayuda para esto. En less `h`. En Vim `:h navigation`.

No lo he dicho de forma explícita pero las man-pages se muestran con less, por eso es lo mismo.

 


Herramientas locas y trucos

Aquí os cuento las herramientas o trucos que suelo hacer, estoy un poco loco así que no recomiendo seguir esto a pies juntillas. Seguro que algo sacáis, de todas maneras.

Copy-paste desde el universo

A todos nos gusta copypastear de Stack Overflow. Esto no es tan fácil desde la terminal. Yo uso xclip y muchas magias más para poder copiar y pegar desde la terminal a X y viceversa. Investigadlo un poco pero resumiendo mucho:

$ xclip -o          # muestra lo que haya en el portapapeles
$ xclip fichero     # manda el fichero al portapapeles
$ comando | xclip   # manda el output del comando al portapapeles

Hay más programas que hacen esto y podemos hacer algo parecido redireccionando las cosas a fichero y abriendo con otras herramientas, etc.

Recuperando el shortcut de arriba para lanzar comandos desde el editor C-xC-e, podéis abrir vuestro editor, pegar en él, analizar lo que habéis pegado y ejecutarlo con sólo salir. Buen truco.

¡No repitas comandos! Usa el historial

Lo primero, para que el comando no se registre en el historial introducid un espacio al principio. Tal que así:

$  ls

Para investigar lo ocurrido anteriormente podéis usar los shortcuts de antes para el reverse-search (C-r, remember remember) y otros, pero no olvidéis el comando history para mostrar todo, que podéis grepear su output y jugar con ello:

$ history | grep command

Tenéis también algunos comandos que actúan sobre el historial, no voy a entrar, lo investigáis. Os dejo uno de oro, que es el único que uso:

$ !!      # ejecuta el comando anterior
$ sudo !! # ejecuta el comando anterior con sudo

O si no, os podéis hacer un alias que se llame fuck como tengo yo en mis dotfiles.

Utilidades generales

Cualquier sysadmin o UNIX lover sabe suficiente de esto, y vosotros, seáis lo que seáis, pues también deberíais.

Como seguramente ya sabéis, podéis desviar la salida estándar (stdout, 1) y la de errores (stderr, 2) a un fichero para guardar el output en él ( >), tomar el input desde un fichero (<), hacer que se redireccione a otro comando en ejecución (el típico pipe, |), mandar curros a background (&) y otras. Si queréis un día os cuento más, pero quiero hacer esto más corto 😀

Estas desviaciones molan pero molan aún más si usamos los ficheros especiales como /dev/null y otros (zero, urandom…). Yo suelo usar mucho /dev/null para descartar output. Es muy común esto en scripts de arranque de demonios.

tee también es un comando que juega con esto y a veces es muy útil. Yo sólo lo uso para guardar un fichero como superusuario cuando lo he abierto sin sudo en Vim. 😀

Podemos suspender procesos con C-z, como decíamos antes y con ellos podemos jugar también.
Usando jobs, bg, fg y disown podemos mandarlos a background (bg) o foreground (fg) y desengancharlos de nuestra terminal (disown). Jobs es la herramienta para mostrarlos en orden, con su PID y todo, si queremos, para poder tirarles un kill.

Tenemos también la alternativa tmux/screen que a parte de servir para multiplexar la terminal, suelen permitir hacer un «detach» y dejar una sesión en background a la que podremos reengancharnos más tarde.

Comandos útiles

tree es una herramienta para hacer un ls en forma de árbol. Muy útil para ver bien. Normalmente hay que instalarlo porque no viene por defecto.

find: la navaja suiza del terminal gladiator. Lista todos los ficheros desde el directorio actual de forma recursiva, esa es su funcionalidad mínima. Puedes añadir filtrados por nombre o por tipo o por mil cosas más. Puedes ejecutar un comando por cada fichero etc. Ser un master en este comando te puede ahorrar mucho tiempo.

xargs: otra joya del terminal killer. Ejecuta comandos tomando un fichero como argumentos. ¿Sabéis cuando descomprimís un tar.gz y no está dentro de una carpeta y el contenido se os mezcla con la carpeta actual? Solución fácil: Creáis una carpeta y lo descomprimís limpiamente dentro, para limpiar el destrozo anterior hacéis lo siguiente:

$ ls carpeta | xargs rm -rf # borra todos los ficheros con el nombre de los que están en la carpeta de la carpeta actual

grep: Sirve para filtrar lineas por patrones que queramos, pero es mucho más poderoso que eso. El puto grep. Usadlo.


 

Creo que voy a dejar de escribir ya.

Me he dejado mil cosas y me gustaría profundizar mucho más pero esto se me está yendo de las manos. Comentad algo y provocad que escriba una segunda parte del post. 😉

¿Qué usáis vosotros? ¿Sois unos gladiadores de la terminal?

Espero vuestras opiniones.