viernes, 22 de septiembre de 2017

Trucos Avanzados del Teclado

A menudo bromeo y describo Unix como “el sistema operativo para la gente que le gusta escribir”. De acuerdo, el hecho es que incluso tenga una línea de comandos es una prueba de ello. Pero a los usuarios de la línea de comandos no les gusta tanto escribir. ¿Por qué entonces muchos comandos tiene nombres cortos como cp, ls, mv y rm? De hecho, uno de los objetivos más preciados de la línea de comandos es la pereza; hacer la mayor cantidad de trabajo con el menor número de pulsaciones. Otro objetivo es no tener que despegar nunca los dedos del teclado, no tener que coger nunca el ratón. En éste capítulo, veremos las funciones de bash que hacen que usemos el teclado más rápido y más eficientemente.

Los siguientes comandos harán su aparición:

  • clear – Limpia la pantalla
  • history – Muestra los contenidos de la lista de historia
Edición de la línea de comandos

bash usa una librería (una colección compartida de rutinas que pueden utilizar diferentes programas) llamada Readline para implementar la edición de la línea de comandos. Ya hemos visto algo de ésto. Sabemos, por ejemplo, que las teclas de las flechas mueven el cursor, pero hay muchas más características. Piensa en ello como herramientas adicionales que podemos emplear en nuestro trabajo. No es importante aprenderlo todo sobre ellas, pero muchas son muy útiles. Cójelas y elígelas como quieras.

Nota: Muchas de las siguientes secuencias de teclas (particularmente aquellas que usan la tecla Alt) podrían ser interceptadas por el GUI para otras funciones. Todas las secuencias de teclas deberían funcionar adecuadamente cuando usamos una consola virtual.

Movimiento del cursor

Teclas usadas para mover el cursor:

Ctrl -a
Mueve el cursor al principio de la línea

Ctrl -e 

Mueve el cursor al final de la línea

Ctrl -f 

Mueve el cursor un carácter hacia delante; igual que la flecha derecha

Ctrl -b 

Mueve el cursor un carácter hacia atrás; igual que la flecha izquierda

Alt -f 

Mueve el cursor hacia delante una palabra.

Alt -b 

Mueve el cursor hacia detrás una palabra.

Ctrl -l 

Limpia la pantalla y mueve el cursor a la esquina superior izquierda. El comando clear hace lo mismo.

Modificando el texto


Comandos de teclado que se usan para editar caracteres en la línea de comandos.

Ctrl -d 

Borra un carácter en la localización del cursor

Ctrl -t 
Traspasa (intercambia) el carácter en la localización del cursor con el que le precede

Alt -t 
Traspasa la palabra en la localización del cursor con la que le precede

Alt -l 
Convierte los caracteres desde la localización del cursor hasta el final de la palabra a minúsculas

Alt -u 
Convierte los caracteres desde la localización del cursor hasta el final de la palabra a mayúsculas

Cortar y pegar (Killing and Yanking) texto
La documentación Readline utiliza los términos killing (matar) y yanking (tirar) para referirse a lo que comúnmente denominamos cortar y pegar. Los elementos que se cortan son almacenados en un buffer llamado kill-ring.

Comando para Cortar y Pegar

Ctrl-k 

Kill (corta) el texto desde la localización del cursor al final de la línea.

Ctrl-u 

Kill (corta) el texto desde la localización del cursor hasta el principio de la línea.

Alt-d 

Kill (corta) el texto desde la localización del curso hasta el final de la palabra actual.

Alt-
Retroceso 
Kill (corta) el texto desde la localización del cursor hasta el principio de la palabra actual. Si el cursor está al principio de una palabra, corta la palabra anterior.

Ctrl-y 

Yank (pega) texto del kill-ring y lo coloca en la localización del cursor

La Meta tecla
Si te aventuras en la documentación Readline, que puedes encontrar en la sección READLINE de la man page de bash, encontrarás el término “meta key”. En los teclados modernos te dirige a la tecla Alt pero no siempre es así.

Volviendo a los tiempos oscuros (antes de los Pcs pero después de Unix) no todo el mundo tenía su propio ordenador. Lo que podían tener era un dispositivo llamado terminal. Un terminal era un dispositivo de comunicación que con contaba con una pantalla para mostrar texto y únicamente la electrónica suficiente dentro para mostrar los caracteres y mover el cursor. Estaba conectado (normalmente con un cable serie) a una computadora mayor o a la red de comunicación de una computadora mayor. Había muchas marcas diferentes de terminales y todas tenían configuraciones de pantalla y teclado diferentes. Como todas tendían al menos a entender ASCII, los desarrolladores de software querían escribir aplicaciones portables reducidas al mínimo común denominador. Los sistemas Unix tienen una forma muy elaborada de tratar con los terminales y sus pantallas. Como los desarrolladores de Readline no podían estar seguros de la presencia de una tecla de control extra, se inventaron una y la llamaron “meta”. Igual que la tecla Alt sirve como tecla meta en los teclados modernos, puedes también pulsar y soltar la tecla Esc para tener el mismo efecto que pulsando la tecla Alt si todavía estás usando un terminal (¡Lo que aún puedes hacer en Linux!).


Completado

Otra forma en que el shell puede ayudarte es mediante un mecanismo llamado completado. El completado ocurre cuando presionas la tecla tabulador mientras escribes un comando. Veamos como funciona. Dado un directorio home que aparece así:

 [me@linuxbox ~]$ ls
 Desktop ls-output.txt Pictures Templates     Videos
 Documents Music Public

Prueba escribiendo lo siguiente pero no pulses la tecla Enter:

 [me@linuxbox ~]$ ls l

Ahora pulsa la tecla tabulador:

 [me@linuxbox ~]$ ls ls-output.txt

¿Ves como el shell completa la línea por tí? Probemos otra vez. De nuevo, no pulses Enter:

 [me@linuxbox ~]$ ls D

Pulsa tab:

 [me@linuxbox ~]$ ls D

No completa, sólo da un pitido. Esto ocurre porque “D” coincide con más de una entrada en el directorio. Para que el completado funcione, el “indicio” que le des no debe ser ambiguo. Si seguimos:

 [me@linuxbox ~]$ ls Do

Y pulsamos tab:

 [me@linuxbox ~]$ ls Documents

El completado funciona.

Aunque este ejemplo muestra el completado de nombres de archivo, que es su uso más común, el completado también funciona con variables (si el principio de la palabra es un “$”), nombres de usuario (si la palabra empieza con “~”), comandos (si la palabra es la primera en la línea.) y nombres de equipo (si la palabra empieza con “@”). El completado de nombres de equipo sólo funciona para los nombres de equipo listados en /etc/hosts.

Hay un número de secuencias de meta teclas y teclas de control que están asociadas al completado:

Comandos de completado


Alt-? 

Muestra una lista de posibles completados. En la mayoría de los sistemas también puedes hacerlo pulsando la tecla tabulador una segunda vez, que es mucho más fácil.

Alt-* 

Introduce todos los completados posibles. Ésto es útil cuando quieres usar más de un resultado posible.

Completado programabscript
le

Versiones recientes de bash tienen una característica llamada completado programable. El completado programable te permite (o mejor dicho, el proveedor de tu distribución te permite) añadir reglas de completado adicionales. Normalmente ésto se hace para añadir soporte para aplicaciones específicas. Por ejemplo es posible añadir completados para la lista de opciones de un comando o para buscar tipos de archivo en concreto que soporte una aplicación. Ubuntu tiene una gran colección definida por defecto. El completado programable se implementa mediante funciones de shell, un tipo de mini scripts de shell que veremos en próximos capítulos. Si eres curioso, prueba:

 set | less

y mira si puedes encontrarlos. No todas las distribuciones las incluyen por defecto.

Usando el historial


Como descubrimos en el Capítulo 1, bash mantiene un historial de los comandos que hemos introducido. Esta lista de comandos se guarda en nuestro directorio home en un archivo llamado .bash_history. El historial es un recurso útil para reducir la cantidad de pulsaciones que tenemos que hacer, especialmente cuando lo combinamos con la edición en la línea de comandos.

Buscando en el Historial


En cualquier momento, podemos ver el contenido del historial así:


 [me@linuxbox ~]$ history | less


Por defecto, bash almacena los últimos 500 comandos que has utilizado. Veremos como ajustar este valor en un capítulo posterior. Digamos que queremos encontrar los comandos que hemos usado para listar /usr/bin. Una de las formas en que podríamos hacerlo sería así:

 [me@linuxbox ~]$ history | grep /usr/bin

Y digamos que entre los resultados tenemos una línea que contiene un comando interesante como éste:

 88 ls -l /usr/bin > ls-output.txt

El número “88” es el número de línea del comando en el historial. Podríamos usarlo inmediatamente mediante otro tipo de expansión llamada expansión del historial. Para utilizar la línea que hemos descubierto podríamos hacer ésto:

 [me@linuxbox ~]$ !88

bash expandirá “!88!” en el contenido de la octogésimo octava línea del historial. Hay otras formas de expandir el historial que veremos un poco más tarde.

bash cuenta también con la capacidad de buscar en el historial incrementalmente. Ésto significa que podemos decirle a bash que busque en el historial mientras vamos introduciendo caracteres, con cada carácter adicional más refinada será nuestra búsqueda. Para empezar una búsqueda incremental pulsamos Ctrl-r seguido del texto que estamos buscando. Cuando lo encuentras, puedes pulsar Enter para ejecutar el comando o pulsar Ctrl-j para copiar la línea del historial a la actual linea de la consola. Para buscar la siguiente coincidencia del texto (en el sentido “hacia arriba” en el historial), pulsamos Ctrl-r de nuevo. Para dejar de buscar, pulsamos Ctrl-g o Ctrl-c. Aquí lo vemos en acción:

 [me@linuxbox ~]$

Primero pulsamos Ctrl-r:

 (reverse-i-search)`':

El prompt cambia para indicar que estamos realizando un búsqueda incremental inversa. Es “inversa” porque estamos buscando desde “ahora” a algún momento en el pasado. Ahora, empezamos a escribir nuestro texto de búsqueda. En este ejemplo “/usr/bin”:

 (reverse-i-search)`/usr/bin': ls -l /usr/bin > ls-output.txt

Inmediatamente, la búsqueda nos devuelve nuestro resultado. Con nuestro resultado podemos ejecutar el comando presionando Enter, o copiarlo a nuestra consola de comandos para editarlo después presionando Ctrl-j. Vamos a copiarlo. Pulsamos Ctrl-j:

 [me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

Nuestro prompt de shell vuelve y nuestra línea de comandos está cargada y ¡lista para la acción!

Atajos de teclas usados para manipular el historial:

Comandos del historial

Ctrl-p 

Se mueve a la anterior entrada del historial. Misma acción que la flecha hacia arriba

Ctrl-n 

Se mueve al la siguiente entrada del historial. Misma acción que la flecha hacia abajo

Alt-< 

Se mueve al principio (arriba) del historial.

Alt-> 

Se mueve al final (abajo) del historial, p.ej., la actual línea de comandos.

Ctrl-r 

Búsqueda incremental inversa. Busca incrementalmente desde el actual comando hacia arriba en el historial.

Alt-p 

Búsqueda inversa, no incremental. Con esta combinación de teclas, escribes las palabras a buscar y presionas enter antes de que la búsqueda se realice.

Alt-n 

Búsqueda hacia delante, no incremental.

Ctrl-o 

Ejecuta el elemento actual en el historial y avanza al siguiente. Ésto es práctico si estás intentando reejecutar !?texto una secuencia de comandos del historial.

Expansión del historial

El shell ofrece un tipo especializado de expansión para elementos del historial usando el carácter “!”. Ya hemos visto cómo el signo de exclamación puede ir seguido por un número para insertar una entrada del historial. Hay otras aplicaciones de la expansión:

Comandos de la expansión del historial


!! 

Repite el último comando. Probablemente es más fácil pulsar la flecha y luego enter.

!número 

Repite el elemento del historial número.

!texto 

Repite el último elemento del historial que empiece con texto.

!?texto 

Repite el último elemento del historial que contenga texto.

script
Además de la función del historial de comandos en bash, la mayoría de las distribuciones Linux incluyen un programa llamado script que se puede utilizar para grabar una sesión de shell completa y almacenarla en un archivo. La sintaxis básica del comando es:

script [archivo]

donde archivo es el nombre del archivo utilizado para almacenar la grabación. Si no se especifica ningún archivo, se usa el archivo typescript. Mira la man page de script para ver una lista completa de las opciones y funciones del programa.

Resumiendo


En este capítulo hemos tratado algunos de los trucos de teclado que el shell ofrece para ayudar a los duros pulsadores de teclas reducir su carga de trabajo. Sospecho que según pase el tiempo y te familiarices más con la línea de comandos, volverás a este capítulo para recoger más de estos trucos. Por ahora, considéralos opcionales y potencialmente útiles.

Para saber más

Wikipedia tiene un buen artículo sobre los terminales:

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.