BAQUIA

Una mirada a la línea de comandos en Linux

En el artículo anterior, vimos una pequeña lista de aplicaciones que considero interesantes y recomendables. En este, mi último artículo de esta serie introductoria a Linux, me gustaría ver algunos conceptos básicos sobre una herramienta tan poderosa como “temida”: La shell. Este artículo será más técnico que los anteriores, pero bueno… ya hay confianza 😉

Aquellos que, como yo, llegasteis a Linux desde el mundo Windows, posiblemente tengáis olvidada la línea de comandos que tan indispensable era en los días de MS-DOS y Windows 3.x. En Linux, la línea de comandos todavía tiene plena vigencia, y es que es una herramienta muy poderosa que los usuarios avanzados prefieren por encima de la interfaz visual.

Empezaré diciendo que esa línea de comandos de MS-DOS a la que me refería antes poco tiene que ver con la que encontramos en Linux. Existen conceptos básicos tan radicalmente opuestos entre ambas que quizá su similitud visual sea la más real. La principal razón por la que son tan diferentes es porque, como hemos dicho con anterioridad, Linux es un sistema operativo basado en UNIX, y su arquitectura poco tiene que ver con la de DOS. Veamos algunos de los conceptos importantes en torno a la shell de Linux/UNIX.

Terminales

Un terminal virtual es una aplicación que nos da acceso a la línea de comandos. En Linux hay en todo momento siete terminales accesibles, seis de los cuales son pura línea de comandos, siendo el séptimo el que tiene funcionando el entorno visual. Los terminales están numerados, y su nomenclatura es ttyN (numeradas del 1 al 7). Para acceder a ellas, debemos usar una combinación de teclas:

Control+Alt+tecla de función correspondiente al número de terminal virtual que queramos acceder.

Ejemplo: Para acceder a tty1 tecleamos Ctrl + Alt + F1. Podemos ver como la terminal virtual muestra una serie de información, pero está a la espera de que algún usuario introduzca sus credenciales para iniciar esa sesión. Para volver a la interfaz visual, teclead Ctrl + Alt + F7.

También podemos abrir terminales virtuales desde dentro del entorno visual. En Ubuntu existen dos principales pre-instaladas: xterm y gnome-terminal. A la segunda podemos acceder desde el menú Aplicaciones > Accesorios > Terminal. A ambas podemos acceder desde el lanzador de aplicaciones (similar a la entrada “Ejecutar” del menú de inicio de Windows) que podemos abrir con la combinación de teclas Alt + F2. Una vez se abra, veremos una pequeña ventana cuyo título dice “Ejecutar una aplicación”. En el campo de texto habilitado tecleamos “xterm” o “gnome-terminal” (sin comillas).

Es importante recordar que en UNIX y Linux, la sintaxis tiene en cuenta las mayúsculas y minúsculas. Este es un cambio importante respecto a Windows y DOS y se traduce, por ejemplo, en que “Dir1” y “dir1” son directorios diferentes.

Carpetas y más carpetas

En Linux todo es un fichero. Sin embargo, para facilitar la organización del sistema operativo de cara al usuario, existe una estructura de carpetas (que en realidad también son ficheros). No existen conceptos como el de unidad lógica de Windows o DOS (el famoso C: ), por lo que cualquier cambio de localización que queramos llevar a cabo en Linux requerirá movernos a otra carpeta. Pero si no existen las unidades lógicas, ¿cómo accedemos a nuestro disco duro, unidad de CD o USB? Fácilmente, accediendo a las carpetas que les corresponden.

En Linux, un dispositivo externo se “monta”. Una vez montado, es accesible como una carpeta más. Nuestro disco duro se monta por defecto y su punto de montaje, que se denomina “root”, se identifica por el símbolo “/” (de nombre “slash”, que es el opuesto al usado en Windows o DOS, el “backslash” con símbolo “”). Sin embargo, otras unidades como un lector de CD o un USB se montan actualmente en la carpeta “/media”. Al ir precedida del símbolo root, entendemos que dicha carpeta “cuelga” de la raíz.

Veamos algunos comandos muy útiles en cuanto a navegación de carpetas se refiere:

cd – Este comando es uno de los que mas usaremos, y nos permite cambiar de directorio. Ejemplos:

cd / Nos lleva al directorio raíz.
cd /home Nos lleva el directorio donde se almacenan las carpetas personales de los usuarios.
cd Nos lleva a nuestro directorio home
cd – Nos lleva al directorio inmediatamente anterior.

pwd – Este comando imprime en pantalla el nombre del directorio en que nos encontramos.

ls – Este comando lista los contenidos de directorio. Para referenciar al mundo DOS/Windows, este comando se corresponde con “dir”, aunque es muchísimo más potente. Ejemplos:

ls /home Lista los contenidos de la carpeta /home. Al menos deberíamos ver una carpeta con el nombre del usuario que creamos en el momento de la instalación. Si creamos más usuarios, deberíamos ver una carpeta listada por cada uno de ellos.
ls -a Lista todos los ficheros en el directorio actual, incluyendo los ficheros ocultos.
ls -l Muestra los contenidos en forma largo, un formato más completo, que incluye los permisos de cada fichero o directorio.
ls -h Muestra los contenidos de forma más facilmente comprensible a simple vista. Los tamaños de los archivos no se muestran en bits, si no que se muestran en KB , MB o GB.

Tened en cuenta que estas opciones son combinables. Así, ejecutar “ls -alh” nos mostraría todos los contenidos y sus características en formato largo y “human readable”. Por otro lado, sólo estoy listando algunas opciones que utilizo a menudo, pero existen muchas más.

Generalmente podemos ver las opciones y funcionalidad de un archivo con la opción “–help”. También podemos usar el comando man, para ver el manual de cada comando, así:

man ls
man cd

Permisos y dueños

Un concepto que es crítico en Linux, dada su naturaleza multitarea y particularmente multiusuario, es el de permisos, dueños, usuarios y grupos. Cualquier elemento en Linux posee una serie de permisos, pertenece a un usuario y a un grupo.

Analicemos lo que devuelve el comando “ls -lh config_backup.xml”:

-rw-r–r– 1 user1 user1 4,7K 2009-10-31 22:26 config_backup.xml

Empezando por la izquierda, vemos un primer carácter que nos muestra un guión, lo que quiere decir que es un fichero estándar. En caso de ser un directorio, veríamos la letra “d”. Siguiendo hacia la derecha vemos nueve caracteres a continuación, que deben interpretarse en grupos de tres.

Los primeros tres (rw-) muestran los permisos del dueño del fichero. La letra r sirve para denotar permiso de lectura. La letra w denota permiso de escritura. La letra x, que no vemos en este caso, denotaría el permiso de ejecución.

El segundo grupo (r–) muestra los permisos del grupo del dueño del fichero. En este caso, simplemente permisos de lectura.

El tercer grupo (r–) muestra los permisos de un usuario cualquiera.

Seguidamente encontramos otras dos palabras (user1 user1). En este caso, muestran que el fichero pertenece al usuario user1 y al grupo del mismo nombre. Lo siguiente que vemos es el tamaño del fichero, la fecha y hora de creación, y el nombre.

Hay dos comandos especialmente interesantes en la gestión de dueños y permisos:

chown Permite cambiar el dueño y el grupo al que pertenece un fichero. En la mayor parte de los casos es necesario ser superusuario para completar esta acción. Ejemplos:

sudo chown user2:user2 config_backup.xml Cambia el dueño y grupo a “user2”.
sudo chown user2 config_backup.xml Cambia el dueño a “user2”.

chmod Permite cambiar los permisos de un fichero. Puede requerir impersonarse como el superusuario. Desde mi punto de vista, la manera más cómoda de manejar este comando es usando los valores octales:

r = 4
w = 2
x = 1

De esta forma, se dan varias combinaciones:

rw (lectura y escritura) = 6
rx (lectura y ejecución) = 5
rwx (lectura, escritura y ejecución) = 7


Ejemplos:

chmod 755 config_backup.xml Cambia los permisos a:

rwx para el dueño
r-x para el grupo
r-x para un usuario cualquiera

chmod 600 config_backup.xml Cambia los permisos a:

rw- para el dueño
— para el grupo
— para un usuario cualquiera

Tuberías y otras herramientas

Obviamente, los comandos que estoy mostrando son muy simples, puesto que esta es una primera toma de contacto. Pero aun así, ¿por qué usar la línea de comandos, que a todas vistas parece mas complicada y “gris” que la interfaz visual, cuando casi todo lo que hemos visto hasta ahora se puede hacer igual en ambas?. Esta pregunta es legítima y correcta, pero como digo, aun no hemos empezado a ver la potencia real de la línea de comandos.

Una de sus herramientas más poderosas está en su capacidad para conectar unos comandos con otros, de forma que podamos completar actividades muy complejas, que nos llevarían mucho esfuerzo y tiempo en la interfaz visual. Estas conexiones se llevan a cabo por lo que se conoce como tuberías, que encauzan el resultado de un fichero y lo convierten en parámetros de entrada para el comando siguiente. Estas conexiones pueden ser tan complejas como nos permita la imaginación.

Para conectar un comando con el siguiente usamos el símbolo “|”, conocido como “pipe” o tubería. Veamos algunos ejemplos:
top | grep firefox Imaginemos que queremos averiguar el consumo de memoria actual de nuestro navegador Firefox. El comando top nos muestra los procesos en ejecución en tiempo real, entre los que se encuentra el navegador web firefox, pero no queremos ver la lista completa, si no el caso particular de Firefox. Cuando conectamos este resultado con el comando grep, que busca el término “firefox”, nos devuelve la línea siguiente:

12783 shred 20 0 389m 123m 28m S 2 3.5 0:37.16 firefox-3.5

Aquí vemos diferentes columnas de información, entre las que se encuentran en porcentaje de uso de CPU y Memoria, 2 y 3,5% respectivamente. Este comando nos muestra un refresco en la información cada pocos segundos. Para salir de él, basta con presionar la tecla “q”.

ls /usr/bin | tail -n 50 | less Ahora imaginemos que buscamos el nombre de un comando, pero no lo recordamos. Sin embargo, creemos que empezaba por “x” o “y”. Con este comando podemos listar los contenidos de la carpeta /usr/bin, que contiene aplicaciones, extraer los 50 últimos y paginarlos para poder visualizar la información fácilmente.

Estos son tan solo dos ejemplos para demostrar la potencia inherente a estas conexiones de comandos, pero como decía antes, el límite lo pone vuestra imaginación.

Otro elemento muy importante es el redireccionamiento de input, output o error. Digamos que podemos manejar y redireccionar los datos que son introducidos a donde queramos, así como el resultado de un comando, o un mensaje de error. Veamos algunos ejemplos:

ls /usr/bin > ls_output Dado que el contenido de la carpeta /usr/bin es muy extenso, podemos enviarlo a un fichero de texto para revisarlo más tarde con calma. Este comando genera el fichero output, que es de texto plano (ya veis que en Linux no es necesario añadir extensiones a los ficheros, el propio sistema operativo detecta el tipo siguiendo otros métodos).

ls /usr/bin | tail -n 60 | grep runner >> xuout En este caso, combinamos conexiones con redireccionamiento mientras buscamos las aplicaciones cuyo nombre contenga la palabra “runner” de entre los últimos 60 programas dentro de la carpeta /usr/bin. Luego los pasamos a un fichero llamado “xuout”. Ya veis que estoy usando “>>” en lugar de “>”. Esto me sirve para crear el fichero si no existe, pero si existe, añade el resultado al final del mismo. Esto es muy práctico cuando queremos almacenar el resultado de nuestros comandos a lo largo del tiempo.

Shell scripting

Como habéis podido comprobar en el apartado anterior, podemos comenzar a incrementar la complejidad de nuestros comandos muy rápidamente, pero también su potencia. En el último ejemplo anterior ya vemos una muestra de algo que no sería tan sencillo llevar a cabo desde un entorno visual, pero como digo, esto son sólo ejemplos muy simples. Es más, la propia shell soporta un lenguaje de scripting con el que podemos realmente programar y dar lugar a rutinas muy complejas y capaces.

Sin embargo, no quiero entrar demasiado en este tema, ya que lo considero complicado y quizá fuera de lugar en un artículo de introducción a la línea de comandos, pero es interesante que sepáis que esta poderosa herramienta está a vuestra disposición. Es más, como suele ser habitual en la comunidad Linux, existen muchas páginas en las que se comparte el código de millares de scripts tipo.

ADVERTENCIA: No ejecutéis scripts ajenos a no ser que entendáis plenamente qué es lo que hacen y podáis garantizar que no van a suponer ningún daño para vuestro sistema operativo y datos.

Conclusión

Este artículo no pretende ser un tutorial sobre la Shell Linux, ni siquiera una guía detallada. Mi idea es mostraros algunas ideas básicas para que tengáis un mejor entendimiento de lo que podemos llegar a conseguir usándola. Para aquellos que ya os hayáis “pegado” con una línea de comandos DOS, probablemente solo necesitáis un periodo de adaptación. Para los que nunca hayais visto una línea de comandos, no os dejeis intimidar por una sintaxis que puede parecer incomprensible. Paciencia y aprendiendo poco a poco. Finalmente, para aquellos que no os guste usar la línea de comandos y no deseéis aprenderla, pues gracias si aun así habéis leído hasta aquí.

En fin, todo llega, y con este artículo termino mi serie introductoria a Linux. Espero que os haya gustado, que os haya servido para aprender cosas que quizá no habíais visto explicadas de una forma sencilla hasta ahora, y sobre todo espero que os haya tentado a sumergiros en el mundo Linux.

Para los interesados, podéis seguir mis devaneos en general y en el mundo Linux en particular desde:

Twitter –
y en mi blog – http://cristalinux.blogspot.com

Saludos, gracias, y hasta la próxima!


Compartir en :


Noticias relacionadas




Comentarios