Capítulo 3. Cómo trabajar con la shell

Tabla de contenidos

3.1. Procedimientos iniciales de la shell Bash
3.2. Usuarios y permisos de acceso
3.3. Comandos importantes de Linux
3.4. El editor vi

Resumen

Al arrancar el sistema Linux, normalmente se accede a una interfaz gráfica de usuario que guía a través del proceso de inicio de sesión y las sucesivas interacciones con el sistema. Aunque las interfaces gráficas de usuario se han hecho muy importantes y cómodas de utilizar, no son el único método de comunicación con el sistema. También puede utilizar una comunicación orientada a texto, como un intérprete de línea de comandos, al que normalmente se hace referencia como shell, desde donde puede introducir comandos. Dado que Linux proporciona opciones para iniciar ventanas de shell desde la interfaz gráfica de usuario, puede utilizar ambos métodos fácilmente.

En el campo de la administración, las aplicaciones basadas en shell son especialmente importantes para controlar los equipos mediante enlaces de red lentos o si se desea realizar tareas como usuario Root en la línea de comandos. Para usuarios “novatos” de Linux puede resultar inusual introducir comandos en una shell, pero pronto descubrirá que la shell no es sólo para los administradores; de hecho, utilizar la shell suele ser la manera más rápida y sencilla de llevar a cabo algunas de las tareas diarias.

Hay varias shells para sistemas UNIX y Linux. La shell por defecto de SUSE Linux es Bash (GNU Bourne-Again Shell).

En este capítulo se describen algunos de los aspectos básicos que necesitará conocer para utilizar la shell. Esto incluye los siguientes asuntos: cómo introducir comandos, la estructura de directorios de Linux, cómo trabajar con archivos y directorios, cómo utilizar algunas funciones básicas, el concepto de usuarios y permisos de Linux, una descripción general de comandos de shell importantes y una breve introducción al editor vi, que es un editor por defecto que siempre está disponible en sistemas Unix y Linux.


3.1. Procedimientos iniciales de la shell Bash

Linux permite utilizar la línea de comandos de forma paralela a la interfaz gráfica de usuario y cambiar fácilmente de una a otra. Para iniciar una ventana de terminal desde la interfaz gráfica de usuario en KDE, haga clic en el icono de Konsole del panel. En GNOME, haga clic en el icono de GNOME Terminal del panel.

Se muestra así la ventana de Konsole o de GNOME Terminal, en cuya primera línea aparece el indicador de comando, como en la Figura 3.1, “Ejemplo de una ventana de terminal de Bash”. En el indicador normalmente se muestra el nombre de inicio de sesión (en este ejemplo, tux), el nombre de host del equipo (aquí, knox) y la vía en uso (en este caso, el directorio personal, indicado por el símbolo de tilde ~). Cuando ha iniciado la sesión en un equipo remoto, esta información muestra siempre el sistema en el se que está trabajando. Cuando el cursor está situado después del indicador, puede enviar comandos directamente al equipo.

Figura 3.1. Ejemplo de una ventana de terminal de Bash

Ejemplo de una ventana de terminal de Bash

3.1.1. Introducción de comandos

Los comandos están compuestos de varios elementos. El primero siempre es el propio comando, seguido de parámetros u opciones. Puede escribir un comando y editarlo utilizando las teclas , , <—, Supr y Espacio. También puede añadir opciones o corregir errores de escritura. El comando se ejecuta cuando se pulsa Intro.

[Important]si no hay noticias, todo va bien

La shell no es detallada: al contrario de lo que ocurre en algunas interfaces gráficas de usuario, normalmente no proporciona mensajes de confirmación cuando se ejecutan los comandos. Sólo aparecen mensajes si se producen problemas o errores.

Recuerde esto con los comandos que permiten suprimir objetos. Antes de introducir un comando del tipo rm para suprimir un archivo, debe estar seguro de que quiere deshacerse del objeto, ya que se suprimirá y no se podrá recuperar, sin que se solicite confirmación.

3.1.1.1. Utilización de comandos sin opciones

Observe la estructura de los comandos con un ejemplo simple: el comando ls, que se utiliza para mostrar el contenido de un directorio. Este comando se puede utilizar con o sin opciones. Si se introduce sólo el comando ls, se mostrará el contenido del directorio activo:

Figura 3.2. Comando ls

Comando ls

A diferencia de lo que ocurre en MS Windows, los archivos de Linux pueden tener una extensión, como .txt, aunque no es necesario que la tengan, lo que dificulta la diferenciación entre archivos y carpetas en la salida del comando ls. Por defecto, los colores pueden ser de ayuda: los directorios se muestran normalmente en azul y los archivos en negro.

3.1.1.2. Utilización de comandos con opciones

Un modo más adecuado de obtener detalles acerca del contenido de un directorio consiste en utilizar el comando ls con una cadena de opciones. Las opciones modifican el funcionamiento de un comando para que realice tareas específicas. Las opciones se separan del comando con un espacio en blanco y van precedidas de un guión. El comando ls -l muestra el contenido del mismo directorio con todos los detalles (formato de lista largo):

Figura 3.3. Comando ls -l

Comando ls -l

A la izquierda de cada nombre de objeto se muestra información relacionada con él en varias columnas. Las más importantes son las siguientes: la primera columna muestra el tipo de archivo del objeto (en este ejemplo, la d corresponde a directorio y el guión - a archivos normales). Las nueve columnas siguientes muestran los permisos de usuario del objeto. Las columnas 11 y 12 muestran el nombre del propietario del archivo y del grupo (en este caso, tux y users). Para obtener más información acerca de los permisos de usuario y el concepto de usuario en Linux, consulte la Sección 3.2, “Usuarios y permisos de acceso”. La siguiente columna muestra el tamaño del archivo en bytes. A continuación aparecen la fecha y la hora del último cambio. La última columna muestra el nombre del objeto.

Si desea ver aún más información, puede combinar dos opciones para el comando ls escribiendo ls -la. De este modo la shell muestra los archivos ocultos del directorio, que están indicados con un punto delante (por ejemplo, .archivooculto).

3.1.1.3. Obtención de ayuda

No se espera que nadie conozca todas las opciones de todos los comandos de memoria. Si recuerda el comando pero no está seguro de las opciones, puede escribir el comando seguido de un espacio en blanco y de --help. Esta opción --help está disponible con muchos comandos. Si se introduce ls --help, se muestran todas las opciones que se pueden emplear con el comando ls.

3.1.2. Estructura de directorios de Linux

Dado que la shell no ofrece una visión general gráfica de los directorios y archivos semejante a la vista de árbol de un gestor de archivos, conviene contar con cierto conocimiento básico de la estructura de directorios por defecto de un sistema Linux. Puede pensar en los directorios como carpetas electrónicas en las que se almacenan archivos, programas y subdirectorios. El directorio de nivel superior en la jerarquía es el directorio raíz al que se hace referencia como /. Este es el lugar desde el que se puede acceder a todos los demás directorios.

La Figura 3.4, “Extracto de un árbol de directorios estándar” muestra el árbol de directorios estándar de Linux, con los directorios personales de los usuarios de ejemplo xyz, linux y tux. El directorio /home incluye los directorios en los que los usuarios individuales pueden almacenar sus archivos personales.

[Note]directorio personal en un entorno de red

Si trabaja en un entorno de red, es posible que su directorio personal no se llame /home, sino que puede estar asignado a cualquier directorio del sistema de archivos.

En la siguiente lista se ofrece una breve descripción de los directorios estándar en Linux.

Figura 3.4. Extracto de un árbol de directorios estándar

Extracto de un árbol de directorios estándar
/

Directorio raíz, punto de inicio del árbol de directorios

/home

Directorios personales de los usuarios

/dev

Archivos de dispositivo que representan componentes de hardware

/etc

Archivos importantes para la configuración del sistema

/etc/init.d

Guiones de arranque

/usr/bin

Programas a los que se accede con frecuencia

/bin

Programas que se necesitan primero en el proceso de arranque

/usr/sbin

Programas reservados para el administrador del sistema

/sbin

Programas reservados para el administrador del sistema y necesarios para el arranque

/usr/include

Archivos de encabezado para el compilador C

/usr/include/g++

Archivos de encabezado para el compilador C++

/usr/share/doc

Diversos archivos de documentación

/usr/share/man

Lista concisa de comandos del sistema (páginas Man)

/usr/src

Código fuente del software de sistema

/usr/src/linux

Código fuente del núcleo

/tmp, /var/tmp

Archivos temporales

/usr

Todos los programas de aplicaciones

/var

Archivos de configuración (como los enlazados desde /usr)

/var/log

Archivos de registro del sistema

/var/adm

Datos de administración del sistema

/lib

Bibliotecas compartidas (para programas enlazados dinámicamente)

/proc

Sistema de archivos de proceso

/sys

Sistema de archivos del sistema en el que se reúne la información del dispositivo para el núcleo

/usr/local

Extensiones locales independientes de la distribución

/opt

Software opcional, paquetes de programas adicionales más grandes (como KDE, GNOME y Netscape)

3.1.3. Utilización de directorios y archivos

Para acceder a un archivo o directorio determinados, debe especificar la vía que lleva a ese directorio o archivo. Hay dos formas de especificar una vía:

  • La vía completa (absoluta) desde el directorio raíz al archivo correspondiente

  • Una vía que empiece en el directorio activo (vía relativa)

Las vías absolutas comienzan siempre con una barra invertida, mientras que las relativas no incluyen la barra al principio.

[Note]en Linux se distingue entre mayúsculas y minúsculas

En Linux se hace distinción entre las mayúsculas y las minúsculas en el sistema de archivos. Por ejemplo, introducir prueba.txt o Prueba.txt no es lo mismo en Linux. Recuérdelo cuando escriba nombres de archivos o vías.

Para cambiar de directorio, utilice el comando cd. Escriba el directorio al que quiera acceder como una opción del comando. Para referirse al directorio actual, utilice un punto (.). El siguiente nivel superior en el árbol está representado por dos puntos (..). Para cambiar al directorio principal del directorio activo, escriba cd ... No olvide dejar un espacio en blanco después del comando cd para separarlo de las opciones. El indicador de comandos mostrará en ese momento la vía al directorio principal del directorio desde el que haya ejecutado el comando. Para cambiar a un directorio que esté dos niveles por encima del directorio activo, escriba cd ../... Con ls -l ../.. se muestra el contenido del directorio situado dos niveles por encima.

3.1.3.1. Ejemplos de referencia a un archivo

En el comando cd de la Sección 3.1.3, “Utilización de directorios y archivos” se emplean vías relativas, pero se pueden utilizar también vías absolutas. Por ejemplo, imagine que quiere copiar un archivo de su directorio personal a un subdirectorio de /tmp:

  1. En primer lugar, desde su directorio personal cree un subdirectorio en /tmp:

    1. Si el directorio activo no es su directorio personal, escriba cd ~ para cambiar a él. Desde cualquier lugar del sistema de archivos, puede acceder a su directorio personal escribiendo cd ~.

    2. Una vez que se encuentre en su directorio personal, introduzca mkdir /tmp/prueba. mkdir corresponde a “make directory”, es decir, "crear directorio". Con este comando se crea un nuevo directorio llamado prueba dentro del directorio /tmp. En este caso, se ha utilizado una vía absoluta para crear el directorio.

    3. Para comprobar la acción realizada, escriba ls -l /tmp. El nuevo directorio prueba debería aparecer en la lista de contenido del directorio /tmp.

  2. A continuación, cree un archivo en su directorio personal y cópielo al directorio /tmp/prueba utilizando una vía relativa.

    1. Introduzca touch miarchivo.txt. Con el comando touch seguido de la opción miarchivo.txt se crea un nuevo archivo vacío denominado miarchivo.txt en el directorio activo.

    2. Compruébelo escribiendo ls -l. El nuevo archivo debería aparecer en la lista de contenidos.

    3. Introduzca cp miarchivo.txt ../tmp/prueba. Con esto se copia el archivo miarchivo.txt en el directorio /tmp/prueba sin que se cambie el nombre del archivo.

    4. Compruébelo escribiendo ls -l /tmp/prueba. El archivo miarchivo.txt debería aparecer en la lista de contenido del directorio /tmp/prueba.

Para mostrar el contenido de los directorios personales de otros usuarios, introduzca ls ~nombre_usuario. En el árbol de directorios de ejemplo de la Figura 3.4, “Extracto de un árbol de directorios estándar”, uno de los usuarios de ejemplo es tux. En este caso, ls ~tux mostraría los contenidos del directorio personal de tux.

[Note]gestión de espacios en blanco en nombres de archivos o directorios

Si un nombre de archivo tiene un espacio, indíquelo colocando una barra invertida (\) como carácter de escape delante del espacio o escriba el nombre del archivo entre comillas simples o dobles. De lo contrario la shell Bash interpretará un nombre de archivo como Mis documentos como los nombres de dos archivos o directorios. La diferencia entre comillas sencillas y dobles es que la expansión de las variables se produce con las dobles. Las sencillas aseguran que la shell interpreta la cadena entrecomillada literalmente.

3.1.4. Funciones útiles de la shell

La introducción de comandos en Bash puede exigir que se escriba mucho. A continuación conocerá algunas funciones de Bash que le facilitan el trabajo y le ahorran el tener que escribir tanto.

3.1.4.1. Historial y completado

Por defecto, Bash “recuerda” los comandos que se han introducido. Esta función se denomina historial. Para repetir un comando que se ha introducido anteriormente, pulse hasta que aparezca el comando anterior en el indicador. También puede moverse por la lista de los comandos introducidos previamente pulsando . Siempre cuenta con la posibilidad de editar ese comando cambiando, por ejemplo, el nombre de un archivo, antes de ejecutarlo pulsando Intro. Para editar la línea de comando, mueva el cursor a la posición que quiera mediante las teclas de flecha y comience a escribir. Utilice Ctrl-R para buscar en el historial.

El completado de un nombre de archivo o de directorio a su longitud total tras escribir las primeras letras es otra de las funciones útiles de Bash. Para utilizar esta función, escriba las primeras letras y después pulse →|. Si el nombre de archivo o la vía se pueden identificar de modo exclusivo, se completan cuando el cursor se desplaza al final del nombre de archivo. En ese momento puede escribir la siguiente opción del comando, si es preciso. Si no se pueden identificar de forma exclusiva el nombre del archivo o la vía (porque hay varios elementos que comienzan con las mismas letras), el nombre de archivo o la vía sólo se completan hasta el punto en el que vuelve a haber varias opciones posibles. Puede obtener una lista de todas ellas pulsando de nuevo →|. A continuación, puede escribir las siguientes letras del archivo o la vía y volver a intentar completarlas pulsando →|. Cuando se completan nombres de archivos y vías con la ayuda de →|, puede comprobar a la vez si el archivo o la vía que quiere introducir existen realmente (y asegurarse de que los escribe correctamente).

3.1.4.2. Comodines

Otra de las comodidades que ofrece la shell son los comodines para la expansión del nombre de las vías. Los comodines son caracteres que pueden sustituir a otros caracteres. Existen tres tipos distintos de ellos en Bash:

?

Coincide exactamente con un carácter arbitrario

*

Coincide con cualquier número de caracteres

[set]

Coincide con uno de los caracteres del grupo especificado dentro de los corchetes, que aquí está representado por la cadena set. Como parte de set también puede especificar clases de caracteres mediante la sintaxis [:clase:], donde una clase puede ser alnum, alpha, ascii, etc.

Con el uso de ! o ^ al principio del grupo ([!set]) coincide con un carácter distinto de los identificados por set.

Si suponemos que el directorio test contiene los archivos Archivoprueba, Archivoprueba1, Archivoprueba2 y archivodatos, el comando ls Archivoprueba? mostrará los archivos Archivoprueba1 y Archivoprueba2. Con ls Archivo*, la lista también incluirá Archivoprueba. ls *prueb* mostrará todos los archivos de muestra. Finalmente puede usar el comodín set para buscar todos los archivos de muestra cuyo último carácter sea un número: ls Archivoprueba[1-9] o mediante la utilización de clases, ls Archivoprueba[[:digit:]].

De los cuatro tipos de comodines, el más amplio es el asterisco. Puede usarse para copiar todos los archivos de un directorio en otro o suprimir todos los archivos con un comando. El comando rm *prueb*, por ejemplo, suprimiría todos los archivos del directorio actual cuyos nombres incluyan la cadena prueb.

3.1.4.3. Visualización de archivos con less y more

Linux incluye dos pequeños programas que permiten ver archivos de texto directamente en la shell: less y more. En lugar de iniciar un editor para leer un archivo como Leame.txt, simplemente introduzca less Leame.txt para mostrar el texto en la ventana de la consola. Utilice la barra espaciadora para bajar una página. Utilice Re Pág y Av Pág para avanzar o retroceder en el texto. Para salir de less, pulse Q.

En lugar de less, también puede utilizar el programa más antiguo more. Sin embargo, es menos conveniente porque no le permite desplazarse hacia atrás.

El programa less (menos) debe su nombre a la frase menos es más y puede usarse también para ver la salida de los comandos de una manera adecuada. Para ver cómo funciona, lea la Sección 3.1.4.4, “Redirección y conductos”.

3.1.4.4. Redirección y conductos

Normalmente, la salida estándar en la shell es la pantalla o la ventana de la consola y la entrada estándar es el teclado. Sin embargo, la shell proporciona funciones que permiten redirigir la entrada o la salida a otro objeto, como un archivo u otro comando. Con la ayuda de los símbolos > y <, por ejemplo, puede remitir la salida de un comando a un archivo (redirección de la salida) o utilizar un archivo como entrada para un comando (redirección de la entrada). Por ejemplo, si quiere escribir la salida de un comando como ls en un archivo, escriba ls -l > archivo.txt. De este modo se crea un archivo con el nombre archivo.txt que incluye una lista del contenido del directorio activo tal y como se genera mediante el comando ls. Sin embargo, si ya existe un archivo con el nombre archivo.txt, este comando lo sobrescribe. Para evitarlo, utilice >>. Si se introduce ls -l >> archivo.txt, sólo se añade la salida del comando ls a un archivo que ya exista con el nombre archivo.txt. Si el archivo no existe, se crea.

En ocasiones también es útil emplear un archivo como entrada para un comando. Por ejemplo, con el comando tr, puede sustituir caracteres redirigidos desde un archivo y obtener el resultado en la salida estándar, es decir, la pantalla. Imagine que quiere sustituir todos los caracteres t del archivo archivo.txt del ejemplo anterior por x y mostrar el resultado en la pantalla. Para ello, escriba tr t x < archivo.txt.

Al igual que la salida estándar, la salida de error estándar se enviará a la consola. Para redirigir la salida de error estándar a un archivo denominado errores, añada 2> errores al final del comando correspondiente. Tanto la salida como el error estándar se guardarán en un archivo denominado todasalida si añade al final >& todasalida.

La utilización de conductos constituye también un tipo de redirección, aunque en este caso no se limita a archivos. Con un carácter de barra vertical (|), puede combinar varios comandos utilizando la salida de uno de ellos como entrada para el siguiente. Por ejemplo, para ver el contenido del directorio actual con less, introduzca ls | less. Sólo tiene sentido hacerlo de esta forma si la salida normal con ls es demasiado larga. Por ejemplo, si ve los contenidos del directorio dev con ls /dev, sólo verá una parte pequeña en la ventana. Vea la lista completa con ls /dev | less.

3.1.5. Archivos de reserva y compresión de datos

Ahora que ya ha creado un buen número de archivos y directorios, ha llegado el momento de saber más sobre los archivos de reserva y la compresión de datos. Supongamos que desea empaquetar todo el directorio test en un archivo que pueda guardar en un dispositivo de almacenamiento USB stick como copia de seguridad o enviarlo por correo electrónico. Para ello, use el comando tar (que corresponde a tape archiver, utilidad Tar). Con tar --help, verá todas las opciones del comando tar. Las opciones más importantes se explican a continuación:

-c

(que corresponde a "create", crear) Crea un archivo de reserva nuevo.

-t

(que corresponde a "table", tabla) Muestra los contenidos de un archivo de reserva.

-x

(que corresponde a "extract", extraer) Desempaqueta el archivo de reserva.

-v

(que corresponde a "verbose", detallado) Muestra todos los archivos en pantalla mientras crea el archivo de reserva.

-f

(que corresponde a "file", archivo) Seleccione un nombre de archivo para el de reserva. Al crear un archivo de reserva, esta opción siempre debe ser la última.

Para empaquetar el directorio test con todos sus archivos y subdirectorios en un archivo de reserva denominado archivoprueba.tar, utilice las opciones -c y -f. Para hacer comprobaciones, añada también -v para seguir el progreso del archivo de reserva aunque esta opción no es obligatoria. Después de usar cd para cambiar al directorio personal, donde está ubicado el directorio test, introduzca tar -cvf archivoprueba.tar test. Después, vea el contenido del archivo de reserva con tar -tf archivoprueba.tar. El directorio test con todos sus archivos y directorios permanece sin cambios en el disco duro. Para desempaquetar el archivo de reserva, introduzca tar -xvf archivoprueba.tar, pero no lo haga todavía.

Para la compresión de archivos, la opción obvia es gzip o para obtener una mejor tasa de compresión bzip2. Sólo tiene que introducir gzip archivoprueba.tar (o bzip2 archivoprueba.tar, aunque en este ejemplo se usará gzip). Con el comando ls, compruebe que el archivo archivoprueba.tar ya no está ahí y que se ha creado en su lugar el archivo archivoprueba.tar.gz. Este archivo es mucho más pequeño y por tanto más adecuado para enviarlo por correo electrónico o almacenarlo en un dispositivo de almacenamiento USB stick.

A continuación, desempaquete este archivo en el directorio test2 creado anteriormente. Para ello, introduzca cp archivoprueba.tar.gz test2 para copiar el archivo en ese directorio. Cambie al directorio con cd test2. Los archivos de reserva comprimidos con la extensión .tar.gz se pueden descomprimir con el comando gunzip. Introduzca gunzip archivoprueba.tar.gz, para obtener como resultado el archivo archivoprueba.tar, el cual se debe extraer a continuación o descomprimirse del formato tar con tar -xvf archivoprueba.tar. También puede descomprimir y extraer un archivo de reserva comprimido en un único paso con tar -xvf archivoprueba.tar.gz (ya no es necesario añadir la opción -z). Con el comando ls, podrá ver que se ha creado un nuevo directorio test con el mismo contenido que el directorio test situado en el directorio personal.

3.1.6. Limpieza

Después de este curso intensivo, debería estar familiarizado con la parte básica de la shell de Linux o la línea de comando. Es posible que quiera limpiar el directorio personal suprimiendo los archivos y directorios de pruebas mediante los comandos rm y rmdir. En la Sección 3.3, “Comandos importantes de Linux”, encontrará una lista de los comandos más importantes y una breve descripción de sus funciones.