Lenguas: es fr

Última revisión: 2015.

Tutorial: línea de comando

El objetivo de este tutorial es desmitificar un poco esta gran herramienta, la línea de comandos. Primero daré una introducción a la misma, después entraré más en detalle y veremos cómo utilizar la línea de comando como un navegador de ficheros. En la tercera parte intentaré mostrar un panorama de algunas tareas corrientes (fechas, calendarios, manejo de procesos, etc.) que pueden igualmente efectuarse desde la línea de comando. La última parte está destinada a algunas notas y pistas para profundizar más en el tema.

Los párrafos que comienzan por Nota comentan detalles (técnicos, históricos,..) que no son imprescindibles para comprender el tutorial.

1 Introducción

Antes de nada, ¿qué es la línea de comando? Para descubrirlo lo primero es ejecutar un emulador de terminal (la aplicación gnome-terminal en Gnome, konsole en KDE). Te invito a hacerlo, para poder probar de forma interactiva a medida que se vayan proponiendo algunos ejemplos.

Una vez abierto el emulador de terminal nos encontramos en línea de comando: o sea, un "prompt", normalmente un pequeño texto con información seguido de un símbolo tal que $, >, o #, lo que daría por ejemplo toto@ordimaison $ o simplemente $. Estamos en este momento a punto de solicitar cosas a la máquina en un lenguaje que presenta similitudes con el lenguaje natural, especialmente con su modo imperativo.

Vamos a escribir efectivamente frases que son órdenes. Toda orden necesita un verbo, estamos hablando de comandos. Lo que produciría, por ejemplo, al escribir ls después del símbolo dólar $ del prompt:

sale una lista de los archivos y carpetas de la carpeta actual. Aquí vemos que hay una carpeta Documents y un archivo tuto.txt. Después de ejecutar el comando recibiremos un nuevo prompt para el próximo comando.

Cada comando es en general realmente el nombre de un programa que se encuentra habitualmente en la carpeta /bin o /usr/bin, salvo algunos comandos básicos que puedan estar integrados en el propio programa que ejecuta la línea de comando (el shell).

Pero ciertas órdenes necesitan algo más que un verbo, hace falta uno o varios complementos de objeto, objetos sobre los cuales se ejecuta la orden: es el papel que realizan de los argumentos. Por ejemplo:

$ cp tuto.txt tuto-sauvegarde.txt

que hace una copia del archivo tuto.txt como otro nuevo fichero llamado tuto-sauvegarde.txt. Los argumentos en algunas ocasiones deben respetar un orden preciso, como en este caso: el orden es lo que representa la preposición « como » en la frase « copia tuto.txt como tuto-copia.txt ».

Se observa que, al igual que en el lenguaje natural, las diferentes palabras se encuentran separadas por espacios.

Evidentemente esto no es todo, ¡sería demasiado simple! La acción de un verbo puede modificarse con la ayuda de adverbios, y de la misma forma puede hacerse para los comandos gracias a las opciones.

La opción -l modifica el comando ls precisando que queremos una lista detallada (-l por "long" que es "largo" en inglés). Obtenemos así más detalles, sobre los cuales no ahondaremos aquí, y aprovechamos para observar que ha aparecido el archivo tuto-sauvegarde.txt después del comando cp anterior. Otras opciones son posibles, como ls -S que precisa que los ficheros deben ir ordenados según su tamaño (-S para "size").

Ciertas opciones, por razones mnemotécnicas, usan varios caracteres: para ls podemos escribir --size en lugar de -s por ejemplo, para mostrar el tamaño de los archivos (hay que fijarse en el uso de -- en lugar de -). Resalto de paso que -s y -S representan opciones diferentes!

Nota. Esto es así en el ls del proyecto GNU, que será probablemente el que tengas en tu ordenador si usas por ejemplo Ubuntu. Pero en sistemas BSD, por ejemplo, los comandos tienen rara vez opciones largas, y el número de opciones es también menor.

Además, ciertas opciones pueden tener un argumento que vaya con ellas, al igual que los comandos tienen argumentos. Es un poco como en una expresión tal que « muestra ordenando en función del tamaño »: el « en función del tamaño » es un argumento de la opción « ordenando » del comando « muestra » y su sintaxis sería ls --sort size.

Podemos mezclar diferentes opciones cuando tengan sentido, y escribir indiferentemente ls --sort size -l o ls -l --sort size para obtener una lista detallada y ordenada según el tamaño. Las opciones cortas pueden habitualmente juntarse: por ejemplo ls -l -S puede acortarse en ls -lS, de ahí la necesidad de -- para distinguir las opciones largas de las cortas.

Ya está, globalmente es todo lo que hay que saber sobre la sintaxis de la línea de comando. Queda, evidentemente, saber qué opciones pueden añadirse a un comando dado, y cuáles son los argumentos que éste puede esperar. Ahí entran en juego las páginas de manual y el comando man, a las cuales se dedica una sección más adelante.

2 La consola: tu nuevo navegador de ficheros

2.1 Manejo básico

Un lector atento habrá observado que se ha hablado en un momento dado de carpeta o directorio actual. Esto se debe a que cuando estamos en línea de comando, nos situamos en un lugar preciso del árbol de ficheros, que se puede consultar con el comando pwd (sin argumentos), y que a veces está incluido en la información que nos ofrece el prompt. Al arranque del terminal pwd mostrará algo como /home/toto que significa que la carpeta actual es una subcarpeta toto de la carpeta /home que a su vez cuelga de la raíz /.

Podemos cambiar de carpeta actual con ayuda del comando cd (change directory). Ya hemos visto que podemos copiar archivos. No hace falta saber más para darse cuenta de que podemos efectuar todas las tareas de un navegador de ficheros. Concretando (cada comando viene seguido de un comentario después del símbolo #):

$ pwd           # mostrar la carpeta actual (print working directory)
$ ls            # mostrar los archivos y carpetas de la carpeta actual
$ cp fichero nuevo-fichero   # copiar fichero como nuevo-fichero
$ cd otra-carpeta # desplazarse en el árbol de ficheros hacia otra carpeta

La otra-carpeta puede especificarse por el nombre de ruta completa, por ejemplo /home/toto/Documents o bien por su ruta relativa como Documents si la carpeta actual es /home/toto. Esto es igualmente válido para los nombres de ficheros del comando cp: manejamos rutas, que pueden corresponder a un archivo o a una carpeta.

Una funcionalidad muy práctica para introducir las rutas es el completado automático con la tecla <tab>. Por ejemplo comenzamos escribiendo cd Doc y después pulsamos <tab> que completará como cd Documents si no hay ambigüedad posible con otros nombres de carpetas.

Dos carpetas particulares tienen un nombre especial: la carpeta actual, y la carpeta anterior justo por encima en el árbol de ficheros. La primera se denomina ., y la segunda ... Así, para volver a la carpeta superior escribiremos:

$ cd ..

El comando mv permite mover o renombrar archivos o carpetas, y se utiliza del mismo modo que cp: mv archivo nuevo-archivo. A la par, el comando rm archivo permite eliminar el archivo cuyo nombre sería el dado por archivo.

Por principio de precaución, cp y rm no pueden copiar o eliminar carpetas enteras y aquello que contienen si no utilizamos la opción -r (recursivo).

Podemos hacer acciones más complejas como copiar todos los pdfs al mismo tiempo de la carpeta actual a la carpeta Documents:

$ cp *.pdf Documents/

gracias al asterisco *. De forma simple *.pdf es una abreviación que será remplazada por la lista de todos los ficheros cuyo nombre termine en .pdf. Así, por ejemplo, si tuto.pdf y autre-tuto.pdf son los pdfs de la carpeta actual, *.pdf es equivalente a tuto.pdf autre-tuto.pdf.

El comando mkdir permite crear una nueva carpeta, y el comando rmdir igualmente eliminar una carpeta vacía.

Una pequeña imagen de una corta sesión de navegación:

Nota. Toda carpeta o archivo tiene permisos que definen derechos de escritura, lectura y ejecución, así como un propietario. Los comandos que permiten manejar estos son chmod (change file modes) para los permisos y chown (change owner) para el propietario. Por ejemplo chmod a+w tuto.txt convierte al archivo tuto.txt en escribible (w de "writable") para cualquier usuario (a para "all"), lo que quizás sea una mala idea, así dicho de paso. El uso de estos comandos se detalla en las páginas man de los comandos respectivos.

2.2 Archivos de un formato particular (ejemplo: imágenes)

A menudo, un navegador de ficheros te permite abrir una imagen con tu visualizador de imágenes por defecto simplemente de un doble clic sobre el nombre del fichero que contiene la imagen (toto.jpg o toto.png por ejemplo). En la línea de comandos, para lograr el mismo resultado sólo hace falta ejecutar el programa de visualización de imágenes con un fichero pasado como argumento. Aquí utilizo feh como visualizador pero cualquier otro similar (eog, gwenview, ristretto, etc.) servirá igual.

$ feh toto.jpg

Para leer un pdf será similar con programas como evince, okular, epdfview, zathura... Por ejemplo con evince:

$ evince toto.pdf

Y finalmente, un vídeo como ejemplo con vlc o mplayer:

$ mplayer toto.ogg

Si el usuario no conoce el tipo de archivo y no sabe con qué programa puede leerlo, puede utilizar el comando xdg-open que ejecutará el programa que esté asociado por defecto a ese tipo de ficheros. Por ejemplo:

$ xdg-open toto.ogg

Probablemente habrás notado que hasta que no se cierra el visualizador de imágenes, de pdf o de vídeo, no puedes escribir más comandos ya que la línea de comando espera que la ejecución del programa de visualización esté acabada. Para poder continuar escribiendo comandos sin tener que cerrar el programa ejecutado podemos utilizar el símbolo & al final del comando. Por ejemplo:

$ evince toto.pdf &

Nota. Cerrar la ventana del emulador de terminal antes que el visualizador de imágenes o de pdf tendrá como consecuencia cerrar éste también al mismo tiempo. Si quieres evitarlo puedes anteponer al comando nohup, que desconecta completamente del shell la ejecución del comando (nohup no es otra cosa que otro comando que toma por argumento otro comando!).

3 Otras tareas habituales de escritorio

3.1 Fechas

El comando date muestra la fecha actual, y el comando cal un calendario. Por defecto únicamente saldrá el mes actual pero la opción -y (year) permite elegir todo el año completo, y -m (monday) que los meses comiencen las semanas por lunes como primer día.

$ cal -m
March 2014
Mo Tu We Th Fr Sa Su
               1  2
3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

3.2 Detener/Reiniciar

El comando halt detiene el sistema. Quizás necesites derechos de administrador sobre el equipo para esta acción con lo que probablemente necesitarás anteponer el comando sudo. De forma análoga, el comando reboot permite reiniciar.

Existen igualmente comandos para hibernar, suspender, etc. Te invito a leer la página man de pm-action (solo en Linux) para más detalles:

$ man pm-action

3.3 Cerrar el emulador de terminal

Basta con cerrar la ventana. También podemos utilizar el comando exit sin argumentos.

3.4 Manejar varias pantallas (por ejemplo: videoproyector)

El comando xrandr permite fácilmente manejar las pantallas, y un simple xrandr --auto bastará normalmente para detectar y configurar un videoproyector por ejemplo.

3.5 Instalar/Desinstalar programas

De esto se encarga el gestor de paquetes de tu sistema. Puede ser por ejemplo apt-get o aptitude, o yum según la distribución. Consulta la documentación oficial de tu distribución para ello.

3.6 Manejar los procesos

Una situación habitual con la que podemos encontrarnos es la de estar obligados a detener un programa que no nos responde. A un programa en ejecución se le llama proceso. El comando top muestra una lista de los procesos más activos, y da asimismo información continua sobre cada uno de ellos. Para cerrar top basta con apretar la tecla q (quit) y h (help) nos mostrará una pantalla de ayuda. Las informaciones más importantes son el nombre del comando que ha originado el proceso, su utilización de la CPU (procesador), y el número PID (process identifier), identificador único que designa el proceso.

Supongamos que hemos arrancado firefox, por ejemplo escribiendo el comando firefox &. Entonces, usando top con la opción -u toto (-u para "user"), obtenemos información sobre todos los procesos iniciados por el usuario toto, lo que nos devolverá:

Las primeras líneas indican información general sobre el sistema, y después viene la lista de procesos, aquí bash (que posibilita la línea de comando) y firefox. En general habrá más procesos pero aquí se ha simplificado por razones pedagógicas.

Otro comando con objetivos similares pero no-interactivo es ps, te invito a consultar su página man para conocer su uso.

Imaginemos que firefox no responde. El número PID de firefox es 9179, entonces podemos usar el comando:

$ kill 9179

que intentará detener la aplicación normalmente. Si esto no da resultados podremos intentar la opción -9 de kill. A menudo cuando un programa que causa problemas tiene un nombre en particular es más práctico usar el comando pkill que funciona de forma similar a kill (y acepta también la opción -9) pero coge un nombre y no un PID como argumento.

$ pkill firefox

Podrás verificar con top que el proceso firefox ya no aparece en la lista.

4 ¿Y ahora?

4.1 Saber más, usando las páginas man

Las páginas de manual pueden consultarse con la ayuda del comando man:

$ man ls

para conocer todos los detalles sobre las opciones y argumentos que puede aceptar el comando ls. Con la tecla h se nos mostrará una pantalla de ayuda con las teclas utilizables. Las más útiles son las teclas de dirección para subir o bajar (o las teclas j y k), y las teclas u (up) y d (down) para avanzar o retroceder de media pantalla. En el anexo doy algunos consejos para entender bien una página de manual. Cuando no conocemos ni el nombre del comando que buscamos podemos probar suerte con el comando apropos.

$ apropos palabra-clave

lo que nos sacará una lista de páginas de manual en relación con la palabra-clave que demos, pero para un uso simple sería adecuado igualmente hacerse una pequeña lista en un papel, o en un simple fichero de texto, lo que evitaría sentirnos desbordados por el número de comandos.

Una página man está siempre estructurada siguiendo el mismo esquema. Está organizada en secciones, en las que las más importantes son la sección NOMBRE (NAME en inglés), la sección SYNOPSIS y la sección DESCRIPTION. La sección NOMBRE indica solo el nombre del programa y una breve descripción. La sección DESCRIPTION contiene la descripción detallada del comando, generalmente seguida de la descripción de las diferentes opciones. La sección SYNOPSIS es un poco particular: da información sobre la sintaxis que admite el comando. Por ejemplo para el comando ls nos encontramos con algo simple tal que:

SYNOPSIS
     ls [option]... [file]....

Las palabras option y file especifican que se trata de una opción o de un nombre de fichero. El hecho de que estén entre corchetes significa que son opcionales. En efecto, las opciones para ls son todas opcionales, y ls sin argumentos devuelve, lo hemos visto, la lista de ficheros y carpetas de la carpeta actual, mientras que ls /home/toto/Documents sacará la lista de la carpeta Documents. Los tres pequeños puntos significan que puede tener tantas opciones o nombre de ficheros como queramos. En principio el orden tiene importancia, y las opciones deben situarse delante de los nombres de ficheros, pero a menudo los comandos permiten en la práctica mezclar argumentos y opciones. .P A veces, cuando el número de opciones no es grande, su listado se puede obtener directamente de la sección SYNOPSIS. Para un ls simple podríamos por ejemplo tener:

SYNOPSIS
     ls [-lS] [--sort word] [file]...

Podemos encontrar varias líneas en esta sección, que corresponden a usos diferentes de un mismo comando. Veremos también de vez en cuando la sintaxis --sort=size para las opciones, con un símbolo = en lugar de un espacio. A veces, palabras como file estarán escritas <file>, en mayúsculas o de modo similar, pero en general detectaremos fácilmente un esquema común.

Nota. La calidad de las páginas man puede variar de un programa a otro, y de un sistema a otro.

4.2 Saber más sobre el shell

Nos ocurrirá, por ejemplo, que al leer listados de ficheros de una carpeta, la lista sea demasiado larga, y que no quepa entera en la pantalla. En este caso podremos utilizar un paginador (como less) con la ayuda de un pipe |. Por ejemplo:

$ ls /usr/share | less

donde ls /usr/share mostrará la lista de ficheros que se encuentran en la carpeta /usr/share, y la enviará gracias a | al programa less para poder recorrerla cómodamente. less es el mismo programa empleado en la lectura de páginas man.

Un pequeño truco muy útil relacionado con lo anterior: supongamos que por cualquier razón queremos guardar en un fichero la salida mostrada por un comando. En este caso necesitamos lo que se llama una redirección de la salida, y se consigue con la ayuda del símbolo >. Por ejemplo:

$ date > fichier.txt

escribirá un fichero de texto llamado fichier.txt que contendrá la fecha actual, en lugar de mostrar la salida del comando date. Cuidado: si el fichero fichier.txt existe, ¡el contenido de éste archivo será borrado! Podemos después leer el fichero por ejemplo con el comando less. Si queremos añadir sucesivamente las fechas a un mismo fichero tendremos que usar el símbolo de redirección >>, que añade el texto a un fichero ya existente pero no remplaza su contenido:

$ date >> fichier.txt

Otro problema típico son los espacios en los nombres de ficheros. En efecto, si una carpeta tiene como nombre tutorial para la línea de comando, el intento de acceder a ella con

$ cd tutorial para la línea de comando

devolverá un error, ya que el comando cd no verá más que tutorial como argumento. Un método para evitar esto es escribir el nombre de la carpeta entre comillas:

$ cd 'tutorial para la línea de comando'

o bien utilizar el carácter de escape \ para los espacios para que sean interpretados literalmente:

$ cd tutorial\ para\ la\ línea\ de\ comando

Una buena costumbre sin embargo para evitar este tipo de situaciones es no utilizar espacios para los nombres de ficheros o carpetas.

Nota. De un sistema a otro el programa de shell puede variar. En la mayoría de distribuciones GNU/Linux (como Ubuntu), el shell por defecto es bash. Aún así, la mayoría de shells tienen una base común (que incluye todo lo expuesto en este tutorial). Por ello, para una explicación más detallada de las funcionalidades es conveniente leer en primer lugar la página man de un shell básico como dash o de talla mediana como ksh antes que las de bash o zsh que son mucho más largas puesto que detallan muchas opciones exóticas.

4.3 Programas que se integran bien en la consola

Como hemos visto, la línea de comando puede servir de punto neurálgico en el uso del escritorio, permitiendo ejecutar los diferentes programas que necesitemos, además integra entre otras las funcionalidades del navegador de ficheros y gestión de procesos. De ahí, que a veces resulte cómodo usar programas que se integren bien en este marco, y que no necesiten la apertura de una nueva ventana o andar alternando demasiado entre ratón y teclado.

Por ejemplo el programa task permite mantener una agenda al día en línea de comando, y está bien documentada gracias a sus páginas de manual y tutoriales.

Destaco también la existencia de programas que utilizan la biblioteca ncurses, que permite mostrar una interfaz gráfica limitada pero simple e intuitiva en la ventana del emulador de terminal. Por ejemplo el programa mutt que es un cliente mail. Su configuración puede ser algo laboriosa y te invito a leer los numerosos tutoriales que hay por la red. También es de mencionar moc, programa para escuchar música, y la utilidad alsamixer que se emplea para configurar los parámetros de sonido.

Algunos de estos programas se configuran mediante un fichero de configuración editable con cualquier editor de texto gráfico (gedit, kate,...) o en modo terminal como nano o mg, y si te ves con ánimos con un editor de texto más completo como vim o emacs.

Si estás interesado puedes incluso probar un multiplexador de terminal como tmux, que te permitirá usar varios terminales en una misma ventana, y por ejemplo copiar fácilmente texto de un terminal a otro y alternar rápidamente entre ellos mediante una combinación de teclas.

5 Conclusión

Espero que este tutorial haya permitido a aquellos que se veían intimidados por la línea de comando sentirse algo más cómodos, y descubrir nuevas utilidades de los comandos, que a veces pasan desapercibidas para muchos.

Ciertas tareas, desgraciadamente, requieren por ahora un mínimo de conocimientos técnicos, pero quizás en un futuro no tan lejano estas dificultades sean superadas y permitan a aquellos que no seamos expertos un uso del escritorio que se base principalmente en la línea de comando si así se desea. Apunte dactilográfico. Resalto que uno de los motivos que pueden echar para atrás a un nuevo usuario de la línea de comando es el simple hecho de escribir comandos, porque escribir en sí requiere una cierta habilidad con el teclado para no sentirse incómodo, torpe o tener miedo de cometer errores. Por ello, sin duda, aprender algo de dactilografía al teclado, con la ayuda por ejemplo de klavaro es una muy buena idea, casi un requisito para un uso intensivo de las nociones enseñadas en este tutorial. Es, igualmente, una buena inversión de tiempo en general para cualquiera que deba escribir textos medianos/grandes de cuando en cuando (mails, informes, etc.).


Traducido al español por dornoj.

Escrito por Anaseto, publicado bajo licencia cc-by-sa. Bastantes ideas (imágenes, xdg-open, pm-utils, lucha contra el tldr,...) provienen de comentarios acertados sobre el tema en el foro de linuxfr: https://linuxfr.org/forums/astucesdivers/posts/tutoriel-sur-la-ligne-de-commande