¿Qué es Linux?

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.

El intérprete de órdenes BASH

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.

Lista básica de órdenes

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
ordenacciónejemplo
bgpasa una orden a ejecutarse en segundo planobg
bzip2compresor de ficherosbzip2 info.dat
bunzip2descompresor de ficherosbunzip2 info.dat.bz2
catmuestra ficheros, por defecto por pantalla. También sirve para concatenar ficheroscat 1 2 > 3
cdcambia el directorio de trabajocd ..
chmodcambia los permisos de un fichero o directoriochmod a+r *
cpcopia ficheros o directorios, puede cambiase el nombrecp hola.txt hola.sh
dfmuestra la cantidad de espacio libre de todos los sistemas de ficheros montados en el sistemadf -h
diffcompara ficheros o directoriosdiff -s 1.dat 2.dat
dumuestra la cantidad de espacio utilizado por un fichero o directoriodu -sh * .
echoimprime por pantallaecho "hola"
fgpasa una orden de segundo a primer planofg
fileinforma del tipo de un ficherofile yo.jpg
findbusca ficherosfind . -iname "*.dat"
grepbusca coincidencias de un expresión regular dentro de un fichero o grupo de ellosgrep lunes informe.txt
gzipcompresor de ficherosgzip info.dat
gunzipdescompresor de ficherosgunzip info.dat.gz
headmuestra las primeras lineas de un ficherohead -1 hola.txt
hostmuestra información sobre la dirección IP de una máquinahost www.ugr.es
hostnamemuestra el nombre de la máquinahostname
jobslista los trabajos ejecutándose en segundo planojobs
lessmuestra el contenido de un fichero haciendo un pausa tras cada páginaless hola.txt
lncrea enlaces a ficheros y directoriosln -sf mipagina.html index.html
lslista los contenidos del directorio de trabajols -lh
manmuestra el manual de una ordenman bash
mountMonta un sistema de fichero en un directoriomount /mnt/usb
mkdircrea un directoriomkdir linux
mvmueve/renombra ficheros o directoriosmv hola.txt tmp
passwdcambia la contraseñapasswd
psinformación sobre procesosps afxu
pwdmuestra el nombre directorio de trabajopwd
quotainforma sobre cuota de discoquota -v
rmborra ficheros y/o directoriosrm hola.html
sedfiltrado y transformación de cadenascat hola.html | sed s/html/HTML/
seqcrea un secuenciaseq -w 0 2 10
sleepdetiene el intérprete un cierto número de segundossleep 2; echo ya
sortordena el contenido de un ficherosort hola.txt
sshiniciar nueva sesión a través de conexión segurassh turing -l yo
sourceejecuta las órdenes contenidas en un ficherosource trabaja.sh
tailmuestra las últimas lineas de un ficherotail -2 hola.txt
taragrupa/separa ficheros y directoriostar cvfzp todo.tgz dir1 dirn file1 filen
timemide tiempos de ejecucióntime sleep 2
topmonitor del sistematop
trtraduce patrones entre una fuente y un destinoecho "12345" | tr 3 _
umountdesmonta un sistema de ficherosumount /mnt/usb
wgetprograma de descarga de ficheros a través de internetwget ftp://micasa.es/mifichero
whichmuestra la ubicación de un programawhich bash
whomuestra una lista de usuarios conectados a nuestro sistemawho
whoamimuestra nuestro nombre de usuariowhoami
xargsañade su entrada a las opciones de una ordenls [ab]*.dat | xargs grep 0.5

Ficheros especiales

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:

nombredescripción
.nombre del directorio en que nos encontramos
..nombre del directorio anterior
~nombre del directorio raiz del usuario
/dev/nullel dispositivo nulo
/dev/dspel dispositivo de sonido
/dev/*dispositivos del sistema
/proc/*información sobre el sistema

Tuberías

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:

Redirecciones

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:

Comodines

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ínsustitución
*cualquier cadena
?cualquier carácter
[]una de los caracteres entre corchetes
{}cadenas entre llaves separadas por comas

Veamos algunos ejemplos:

Permisos

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:

permisos de ficheros en sistemas de ficheros unix

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. Para identificar a quien afecta el cambio podemos usar los modificadores user, group, others y all. 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.

Segundo plano

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.

Encadenamiento de órdenes

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:

sufijoacciónejemplo
;ejecuta órdenes de forma secuencial independientemente del resultado de cada una de ellasls; ps
&&ejecuta órdenes de forma secuencial mientras el resultado de cada una de ellas sea 1sort 1.dat && echo "ok"
||ejecuta órdenes de forma secuencial mientras el resultado de cada una de ellas sea 0sort 1.dat || echo "error"

Programación de scripts en BASH

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

Curiosidades

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

Gustavo Romero López
Last modified: Thu Feb 22 12:04:47 CET 2007