El otro día me preguntaron: "¿En qué lenguaje se escribe cuando estoy en la terminal de mi PC? estoy ya un poco harta de copiar líneas sin entender ni papa...".

Mi respuesta ha sido algo larga, y por si fuera poco sobresimplificada, pero creo que es una buena introducción al mundo de los shell Unix para todos aquellos que llegan del mundo 'clickclickclick' de Windows y se encuentran que en Linux, cada vez que tienen un problema, alguien en un foro les recomienda abrir un terminal y escribir un montón de palabras raras. Aquellos que sepan algo del tema mejor se abstienen, porque hay mucha simplificación para no complicar las cosas.

 Depende del PC. En cualquier caso es un 'shell', un intérprete de comandos.

En Windows, se usa un terminal muy simple, basado en la sintaxis DOS (además del más usual y completo, que es gráfico). En Unix, hay toda una variedad de ellos. Los sistemas Linux suelen utilizar bash o alguno compatible. Ubuntu creo que utiliza dash (compatible con bash).

Todos ellos son programables (aqui tienes un largo tutorial en inglés, si te interesa), pero su fundamento no es ese. Es el de ejecutar programas (lo que se teclea) y mostrar su respuesta.

Los programas (en general, pero se nota - por el uso - sobre todo en Unix) tienen un nombre (la primera palabra de la linea) y luego una serie de argumentos que se les pasa. El entorno GNU/Linux incluye un montón de pequeños programas (es la parte 'GNU' del nombre completo de Linux*), de los cuales, algunos de los más habituales son:

  •  echo: simplemente devuelve su argumento. 'echo "hola mundo"' devolvería: 'hola mundo'. Es útil dentro de scripts (guiones que son básicamente una serie de instrucciones al shell) para mostrar mensajes al usuario.
  • cat: devuelve el contenido de un fichero o varios concatenados.
  • ls: devuelve el listado del directorio actual.
  • pwd: devuelve la ruta del directorio actual.
  • rm: elimina (remove) el o los ficheros pasados en argumento.
  • mv: mueve el o los ficheros pasados en argumento.
  • cp: copia el o los blablabla
  • cd: cambia de directorio
  • sed: es un complicado editor de textos que funciona por linea de comandos únicamente
  • grep: permite buscar el texto del primer argumento dentro de el o los ficheros pasados después
  • find y locate: dos formas de encontrar ficheros en el disco duro. El primero es lento pero seguro, el segundo usa una base de datos actualizada, generalmente, una vez al día, con lo cual puede no estar siempre a la última.
  • mount y umount: permiten respectivamente montar y desmontar una unidad de disco (u otras cosas) en un directorio. 'Montar' es básicamente conectar un dispositivo de hardware a un directorio del sistema de archivos, permitiéndonos acceder a su contenido.
  • ln: Permite crear enlaces simbólicos (similares a los accesos directos, pero más transparentes).
  • chmod: permite cambiar los permisos de un archivo. Estos se dividen en tres grupos, uno por cada tipo de usuario ('o', propietario; 'g', miembros del grupo; 'o', todos los demás; 'a' es un metagrupo que se refiere a todos a la vez). Cada grupo tiene tres permisos: r, lectura; w, escritura; y x, ejecución. Puedes por ejemplo hacer que sólo tú puedas leer pepe.txt haciendo: chmod og-rw pepe.txt (og es others y group, - quita permisos - + los daría - y rw se refiere a lectura y escritura).
  • chown: permite cambiar propietario y grupo de un fichero.
  • groups: permite ver en qué grupos está un usuario. Se pueden cambiar con 'usermod'.
  • passwd: permite modificar la contraseña del usuario.

...y mucho más.

Además de eso, los shell suelen permitir la redirección de lo que devuelven los programas. Es decir, en vez de mostrarlos en pantalla, puede reenviarlos a otro sitio. '|' reenvía otro programa; '>' reenvía a un fichero; '>>' es como el anterior pero añadiendo en vez de reemplazando. Por ejemplo (nota: ls -l pasa la opción 'l' a ls, que muestra un listado con un fichero por línea): ls -l | grep 'hola' #Devuelve los ficheros del directorio actual cuyo nombre contenga 'hola'. echo "Un fichero vacío" > pepe.txt_ # pepe.txt es ahora un fichero de texto que contiene "Un fichero vacío"._ echo "Lista de ficheros" > pepe.txt # ahora pepe.txt ya no contiene "Un fichero vacío", sino "Lista de ficheros". ls -l >> pepe.txt # Ahora pepe.txt contiene "Lista de ficheros" seguido de la lista de ficheros del directorio actual.

También existe la redirección de entrada '<', que pasa al programa los contenidos de un fichero como si se estuviesen tecleando, pero eso ya es más complicado de usar.

Por último, algunas notas sobre las rutas:

  1. Existen tres directorios especiales:
    • '.': el directorio actual. Por ejemplo ./hola.txt es el fichero hola.txt del directorio donde nos encontramos.
    • '..': el directorio padre del actual.
    • '/': el directorio raíz.
  2. La estructura básica de un sistema Linux (y en menor medida, todos los Unix) es siempre la misma: /bin : binarios (ejecutables) básicos del sistema /sbin : lo mismo, pero para mantenimiento del sistema, normalmente sólo para el superusuario (root). /etc : configuraciones generales del sistema (todos los ficheros de configuración que son específicos de cada usuario van aqui) /media: directorio bajo el cual se montan los dispositivos de almacenaje como llaves usb, discos duros externos, etc. /dev : directorio del sistema, rellenado por los drivers, que viene a ser una especie de mapa del hardware (por eso al montar, habitualmente se usan comandos como 'mount /dev/sdXX /media/disco'=> conectamos un hardware - /dev/sdX - con un directorio - /media/disco). /usr : incluye una estructura con 'bin', 'lib', 'share'. Es donde se instalan los programas no esenciales del sistema. Por eso casi todos los programas que instales se pueden ejecutar con un '/usr/bin/<nombre>'.

Hay más, aunque esos son los básicos. Este enlace los detalla todos.

  • Linux es el núcleo del sistema operativo, creado por Linux Torvalds. Para utilizarlo, se necesita un conjunto de programas y aplicaciones, creados originalmente por la fundación GNU de Richard M. Stallman (de ahí el nombre), aunque hoy en día hay mucha más diversidad. Torvalds y Stallman representan las dos facciones principales del mundo libre: OpenSource y Free. Los primeros avocan únicamente por el código abierto de sus propios programas, y que cada cual haga lo que quiera. Los segundos son mucho más radicales, imponiendo la apertura a todos los que usen su código, etc. Stallman inventó la GPL (GNU Public Licence) para sus fines, con versiones cada vez más estrictas (la actual es la 3).