LINUX es un núcleo de sistema operativo. Por analogía suele denominarse así a toda una serie de distribuciones. Una distribución no es más que una recopilación de programas, que en conjunto, podríamos llamar sistema operativo. Los puristas prefieren referirse a estos como sistemas GNU/Linux en el caso de recopilaciones de programas de software libre.
Las nuevas versiones disponen de interfaces gráficos de usuario similares, o incluso mejores, que la de Windows, con lo cual tanto su instalación como su manejo son bastante sencillos.
En este curso vamos a centrarnos en lo que podemos hacer más fácilmente con Linux y no con Windows: dar órdenes desde el teclado. Aunque todavía no lo sepáis, y os parezca mentira, llegará un momento en que prefiráis trabajar con esto en lugar de con esto.
Cuando se está aprendiendo a utilizar un nuevo sistema, el interfaz gráfico puede hacernos más fácil la tarea, pero a la larga un interfaz de órdenes es mucho más eficiente. Pero claro, también es cuestión de gustos. Lo más sensato es utilizar lo mejor de cada método de comunicación con el ordenador.
A la mayoría de vosotros, que provenís del mundo de Windows, si os pidiesen que mostráseis los ficheros del directorio "c:\windows\system", ¿Cómo lo haríais? Lo normal es que pinchaseis en el icono Mi PC, luego en el Disco C, después en el directorio Windows y, finalmente, en el directorio system. Si la ruta es larga pueden ser muchos "clicks" y algún que otro desplazamiento de ventana con la barra de desplazamiento.
Los más viejos de vosotros, que habéis conocido una cosa llamada MSDOS, podríais decir que hay que escribir dir c:\windows\system en un sitio llamado símbolo del sistema. Este método, aunque mucho más eficaz, requiere un mayor esfuerzo de aprendizaje. A la pregunta de si este esfuerzo merece la pena, la respuesta es sí. Más tarde veremos por qué.
Otra de las grandes diferencias entre las filosofía Unix y Windows es el método de trabajo. En Windows se suelen preferir grandes aplicaciones que sean capaces de hacerlo todo. En Unix se prefieren pequeñas aplicaciones que sean capaces de realizar tareas muy sencillas pero de forma muy eficiente. El método Unix tiene la ventaja de ser más sencillo de mantener, pues la complejidad de muchos programas pequeños es mucho menor que la de uno solo muy grande. Por otro lado, tiene la desventaja de hacernos aprender a utilizar muchos programas en lugar de uno sólo.
En cualquier distribución de linux tendremos acceso a varios miles de programas desde el intérprete de órdenes. A continuación veremos un resumen de las más básicas.
| órdenes básicas del intérprete de comandos BASH | ||
|---|---|---|
| orden | acción | ejemplo |
| bg | pasa una orden a ejecutarse en segundo plano | bg |
| bzip2 | compresor de ficheros | bzip2 info.dat |
| bunzip2 | descompresor de ficheros | bunzip2 info.dat.bz2 |
| cat | muestra ficheros, por defecto por pantalla. También sirve para concatenar ficheros | cat 1 2 > 3 |
| cd | cambia el directorio de trabajo | cd .. |
| chmod | cambia los permisos de un fichero o directorio | chmod a+r * |
| cp | copia ficheros o directorios, puede cambiase el nombre | cp hola.txt hola.sh |
| df | muestra la cantidad de espacio libre de todos los sistemas de ficheros montados en el sistema | df -h |
| diff | compara ficheros o directorios | diff -s 1.dat 2.dat |
| du | muestra la cantidad de espacio utilizado por un fichero o directorio | du -sh * . |
| echo | imprime por pantalla | echo "hola" |
| fg | pasa una orden de segundo a primer plano | fg |
| file | informa del tipo de un fichero | file yo.jpg |
| find | busca ficheros | find . -iname "*.dat" |
| grep | busca coincidencias de un expresión regular dentro de un fichero o grupo de ellos | grep lunes informe.txt |
| gzip | compresor de ficheros | gzip info.dat |
| gunzip | descompresor de ficheros | gunzip info.dat.gz |
| head | muestra las primeras lineas de un fichero | head -1 hola.txt |
| host | muestra información sobre la dirección IP de una máquina | host www.ugr.es |
| hostname | muestra el nombre de la máquina | hostname |
| jobs | lista los trabajos ejecutándose en segundo plano | jobs |
| less | muestra el contenido de un fichero haciendo un pausa tras cada página | less hola.txt |
| ln | crea enlaces a ficheros y directorios | ln -sf mipagina.html index.html |
| ls | lista los contenidos del directorio de trabajo | ls -lh |
| man | muestra el manual de una orden | man bash |
| mount | Monta un sistema de fichero en un directorio | mount /mnt/usb |
| mkdir | crea un directorio | mkdir linux |
| mv | mueve/renombra ficheros o directorios | mv hola.txt tmp |
| passwd | cambia la contraseña | passwd |
| ps | información sobre procesos | ps afxu |
| pwd | muestra el nombre directorio de trabajo | pwd |
| quota | informa sobre cuota de disco | quota -v |
| rm | borra ficheros y/o directorios | rm hola.html |
| sed | filtrado y transformación de cadenas | cat hola.html | sed s/html/HTML/ |
| seq | crea un secuencia | seq -w 0 2 10 |
| sleep | detiene el intérprete un cierto número de segundos | sleep 2; echo ya |
| sort | ordena el contenido de un fichero | sort hola.txt |
| ssh | iniciar nueva sesión a través de conexión segura | ssh turing -l yo |
| source | ejecuta las órdenes contenidas en un fichero | source trabaja.sh |
| tail | muestra las últimas lineas de un fichero | tail -2 hola.txt |
| tar | agrupa/separa ficheros y directorios | tar cvfzp todo.tgz dir1 dirn file1 filen |
| time | mide tiempos de ejecución | time sleep 2 |
| top | monitor del sistema | top |
| tr | traduce patrones entre una fuente y un destino | echo "12345" | tr 3 _ |
| umount | desmonta un sistema de ficheros | umount /mnt/usb |
| wget | programa de descarga de ficheros a través de internet | wget ftp://micasa.es/mifichero |
| which | muestra la ubicación de un programa | which bash |
| who | muestra una lista de usuarios conectados a nuestro sistema | who |
| whoami | muestra nuestro nombre de usuario | whoami |
| xargs | añade su entrada a las opciones de una orden | ls [ab]*.dat | xargs grep 0.5 |
En unix todo es tratado como un fichero, y tanto los dispositivos como los directorios no son una excepción. Veamos algunos de los más importantes:
| nombre | descripción |
|---|---|
| . | nombre del directorio en que nos encontramos |
| .. | nombre del directorio anterior |
| ~ | nombre del directorio raiz del usuario |
| /dev/null | el dispositivo nulo |
| /dev/dsp | el dispositivo de sonido |
| /dev/* | dispositivos del sistema |
| /proc/* | información sobre el sistema |
En el mundo Unix una tubería es una forma de comunicar dos programas. Con ellas se consigue conectar la salida estándar de un programa con la entrada estándar de otro. Veamos algunos ejemplos:
Permiten modificar el comportamiento de algunos programas de forma que no generen o reciban información por la vía habitual sino por otra. Esto, que así explicado parece algo difícil, es muy fácil de comprender con algunos ejemplos:
Podemos utilizar comodines para sustituir parte del nombre de un fichero o un grupo de ellos. Esta es una forma cómoda de referirnos a un conjunto de ficheros o directorios.
| comodín | sustitución |
|---|---|
| * | cualquier cadena |
| ? | cualquier carácter |
| [] | una de los caracteres entre corchetes |
| {} | cadenas entre llaves separadas por comas |
Veamos algunos ejemplos:
Los sistemas de ficheros unix suelen emplear 10 bits para especificar los permisos de un fichero. Vamos a dejar el primer bit aparte, que es para indicar tipos de ficheros especiales como directorios, y a centrarnos en los últimos 9. Estos 9 bits se dividen en 3 grupos de 3 bits. Estos 3 bits son para lectura, escritura y ejecución. Los 3 grupos hacen referencia al propietario, al grupo y a otros. De forma gráfica, están repartidos de la siguiente forma:
La forma de ver los permisos de nuestros ficheros es mediante la orden ls -l. Cada uno de estos bits pueden activarse o desactivarse juntos o por separado mediante la orden chmod. Veamos algunos ejemplos:
Hay otros muchos atributos que pueden poseer los ficheros y a los cuales se puede acceder a través de las órdenes lsattr y chattr, pero quedan fuera del alcance de este curso.
A veces interesa poder ejecutar varios programas a la vez. Una posible solución es ejecutarlos en lo que se denomina ejecución en segundo plano o ejecución de fondo. Se denomina primer plano al programa que al ejecutarse ocupa el intérprete de órdenes. Si por ejemplo estamos ordenando un fichero muy largo y el proceso dura varios minutos podemos ejecutarlo de forma que una vez lanzado deje libre el terminal. La forma de hacerlo es añadiendo un & al final de una orden.
Imaginemos que queremos ordenar dos ficheros, y que cada uno de ellos tardará varios minutos. La peor solución sería lanzar la orden que ordena el primero, esperar a que acabase y luego lanzar el segundo. Podemos hacer que las dos se ejecuten simultáneamente y que además el terminal quede libre para poder seguir trabajando de esta forma: sort 1.dat > 1o.dat & sort 2.dat > 2o.dat &.
En cualquier momento podemos hacer que una orden pase de primer a segundo plano y viceversa. Para pasar una orden de segundo a primer plano y así poder interactuar con ella debemos usar fg. Para pasar una aplicación que se esté ejecutando en primer plano al segundo deberemos interrumpirla previamente pulsando control+z son lo que el proceso queda detenido. Ejecutando ahora bg conseguimos que se reanude su ejecución, ahora en segundo plano. Para ver todas las órdenes que pudiésemos tener ejecutándose en segundo plano utilizad jobs.
Varias órdenes pueden ser encadenadas de diversas formas. Algo que debemos saber para poder aplicar esta posibilidad es que cada vez que una orden finaliza con éxito esta devuelve un valor 0 al sistema operativo. En caso de error se devuelve un valor distinto de 0 que podría utilizarse para descubrir que ha pasado. Veamos a continuación que posibilidades existen:
| sufijo | acción | ejemplo |
|---|---|---|
| ; | ejecuta órdenes de forma secuencial independientemente del resultado de cada una de ellas | ls; ps |
| && | ejecuta órdenes de forma secuencial mientras el resultado de cada una de ellas sea 1 | sort 1.dat && echo "ok" |
| || | ejecuta órdenes de forma secuencial mientras el resultado de cada una de ellas sea 0 | sort 1.dat || echo "error" |
Un "script" es un programa capaz de ser ejecutado por el intérprete de órdenes. El ejemplo más típico de programa que se muestra siempre que se comienza a aprender un nuevo lenguaje de programación es aquel que escribe "hola mundo" en la pantalla. Veamos como sería en bash:
#!/bin/bash echo "hola mundo"
La primera línea es especial. Tiene la sintaxis de un comentario por comenzar por "#" y en realidad lo que hace es indicar la localización del intérprete de órdenes. Para comenzar escribiremos el ejemplo con algún editor tal como emacs, gedit, joe, nedit, vi, xemacs,... Hay muchos, pero os aconsejo utilizar alguno gráfico como gedit. Una vez tecleado lo guardaremos con el nombre "hola.sh". A partir de ahora podemos ejecutar el contenido de este fichero mediante la orden source hola.sh. Si queremos ejecutarlo sin tener que utilizar la orden source tendremos que darle permisos de ejecución con chmod +x hola.sh. Ahora ya podemos escribir hola.sh o ./hola.sh(en caso de no tener el directorio de trabajo en el PATH) para que se ejecute.
Existe todo un lenguaje de programación en bash, pero de nuevo su uso está fuera de los objetivos de este curso. Por ahora vamos a conformarnos con poder crear ficheros que ejecuten un lista de órdenes que nos pueda interesar repetir. Para más información, consultar el manual de bash en linea (man bash) o en html
A veces no es necesario escribir el nombre completo de un fichero o directorio. Tras escribir las primeras letras se puede pulsar la tecla tab y el resto se completará sólo. Pulsando dos veces tab obtendremos una lista de las posibilidades de autocompletación.
Podemos interrumpir la ejecución de un programa en cuanquier momento pulsando la combimación de teclas control+c.
Y yo... ¿qué intérprete de órdenes utilizo?
[gustavo@localhost ~]$ echo $SHELL /bin/bash