Última revisión: 2015.
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.
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.
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.
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!).
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
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
Basta con cerrar la ventana. También podemos utilizar el comando
exit
sin argumentos.
El comando
xrandr
permite fácilmente manejar las pantallas, y un
simple
xrandr --auto
bastará normalmente para detectar y configurar un
videoproyector por ejemplo.
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.
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.
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.
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.
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.
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