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

Tabla de contenidos

27.1. Uso de la shell Bash en la línea de comando
27.2. Usuarios y permisos de acceso
27.3. Comandos importantes de Linux
27.4. El editor vi

Resumen

Las interfaces gráficas de usuario son cada vez más importantes para Linux, aunque el uso del ratón no es siempre la mejor manera de realizar las tareas diarias. La línea de comando ofrece gran flexibilidad y eficacia. Las aplicaciones basadas en texto son especialmente importantes para controlar los equipos por enlaces de red lentos o si desea realizar tareas como usuario Root en la línea de comando en xterm. La shell Bash es el que interpreta por defecto la línea de comando en SUSE Linux.

Linux es un sistema multiusuario y el acceso a los archivos se controla mediante los permisos de usuario. Tanto si usa la línea de comando como si emplea una GUI (interfaz gráfica de usuario), es útil entender el concepto de "permiso". Cuando se usa la línea de comando, hay un buen número de comandos importantes. El editor de texto vi se usa con frecuencia al configurar un sistema desde la línea de comando. También es muy popular entre los administradores de sistemas y los desarrolladores.

27.1. Uso de la shell Bash en la línea de comando

En la barra de tareas de KDE se encuentra un icono que representa un monitor con una concha. Al hacer clic en él, se abrirá una ventana de terminal en la que introducir los comandos. Konsole, el programa de terminal, normalmente ejecuta la shell Bash (Bourne again shell), un programa desarrollado como parte del proyecto GNU. En el escritorio de GNOME, haga clic en un icono con un monitor de PC en el panel superior para iniciar un terminal que normalmente ejecuta la shell Bash.

Una vez abierto la shell, vea el indicador de la primera línea. El indicador consiste normalmente en el nombre de usuario, el nombre del host y la vía actual, pero puede personalizarse. Cuando el cursor está situado después del indicador, puede enviar comandos directamente al equipo.

27.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. Los comandos se ejecutan al pulsar Intro. Antes de hacerlo, edite la línea de comando, añada opciones o corrija errores de escritura. Uno de los comandos usados con más frecuencia es ls, que puede utilizarse con o sin argumentos. Si se introduce sólo el comando ls, se mostrará el contenido del directorio actual.

Las opciones llevan delante un guión. El comando ls -l, por ejemplo, muestra los contenidos del mismo directorio con todos los detalles (formato de lista largo). Junto a cada nombre de archivo, está la fecha en la que se creó, el tamaño en bytes y algunos detalles más que se explicarán más adelante. Una opción importante que existe para muchos comandos es --help. Al introducir ls --help, se muestran todas las opciones del comando ls.

Es importante colocar las “comillas” correctamente. Si un nombre de archivo tiene un espacio, evite el espacio mediante una barra invertida (\) o ponga 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.

27.1.2. Archivos y directorios

Para usar la shell de manera eficiente, es muy útil contar con algún conocimiento de las estructuras de archivos y directorios 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.

El directorio /home contiene los directorios en los que los usuarios individuales pueden almacenar sus archivos personales. La Figura 27.1, “Extracto de un árbol de directorios estándar” muestra el árbol de directorios estándar en Linux, con los directorios personales de los usuarios de ejemplo xyz, linux y tux. El árbol de directorios de un sistema Linux cuenta con una estructura funcional que sigue el estándar jerárquico del sistema de archivos (FHS). En la siguiente lista se ofrece una breve descripción de los directorios estándar en Linux.

Figura 27.1. 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, Netscape)

27.1.3. Características de la shell Bash

Hay dos características importantes de la shell que pueden hacer que su trabajo sea mucho más fácil:

Histórico

Para repetir un comando que se ha introducido anteriormente, pulse hasta que aparezca el comando anterior en el indicador. Desplácese por la lista de los comandos previamente introducidos pulsando . 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.

Completar

Completa el nombre del archivo en toda su extensión después de escribir las primera letras hasta que se identifica perfectamente. Para utilizar esta función, escriba las primeras letras y después pulse Tabul. Si hay varios nombres de archivos que empiezan por las mismas letras, obtenga una lista de ellos pulsando Tabul dos veces.

27.1.3.1. Primer ejemplo: Gestión de archivos

Ahora que ya sabe cómo es un comando, los directorios que existen en SUSE Linux y cómo se pueden acelerar algunos procesos mediante la shell Bash, ponga en práctica este conocimiento con un pequeño ejercicio.

  1. Abra una consola desde el escritorio de KDE o GNOME haciendo clic en el icono de la concha.

  2. Escriba el comando ls para ver los contenidos del directorio personal.

  3. Utilice el comando mkdir (que significa crear directorio) para crear un nuevo subdirectorio denominado test escribiendo mkdir test.

  4. Ahora inicie un editor pulsando Alt-F2 y escriba kate para lanzar Kate en KDE y gedit para lanzar Gedit en GNOME. Escriba unas cuantas letras en el editor y guarde el archivo como Archivoprueba en el directorio personal. Linux distingue entre mayúsculas y minúsculas. Para este ejemplo, utilice una A mayúscula.

  5. Vuelva a ver el contenido del directorio personal. En lugar de escribir ls de nuevo, pulse dos veces y el comando ls debería volver a aparecer en el indicador. Pare ejecutar el comando, pulse Intro. El directorio recién creado test debería aparecer con letras azules y Archivoprueba en negro. Esta es la forma en que directorios y archivos pueden distinguirse en la consola.

  6. Mueva Archivoprueba al subdirectorio test con el comando mv. Para acelerar este proceso, utilice la función de expansión: escriba solamente mv A y pulse Tabul. Puesto que no hay ningún otro archivo que comience por esa letra en el directorio, la shell expandirá el nombre del archivo y añadirá la cadena rchivoprueba. Si no es así, añada una letra o dos y pruebe pulsando Tabul cada vez para ver si la shell puede expandir ahora el nombre. Finalmente, escriba un espacio, a continuación test después del nombre del archivo expandido y pulse Intro para ejecutar el comando.

  7. En este momento, Archivoprueba no debería estar ya en el directorio. Compruébelo escribiendo ls de nuevo.

  8. Para ver si el archivo se ha movido con éxito, cambie al directorio test con el comando cd test. Ahora introduzca ls de nuevo. Debería ver Archivoprueba en la lista. Vuelva a su directorio personal en cualquier momento escribiendo sólo cd.

  9. Para hacer una copia de un archivo, utilice el comando cp. Por ejemplo, escriba cp Archivoprueba Copiaprueba para copiar Archivoprueba enCopiaprueba. Una vez más, el comando ls se puede emplear para ver si ambos archivos están en el directorio.

27.1.4. Especificación de vías

Al trabajar con archivos o directorios, es importante especificar la vía correcta. Sin embargo, no necesita escribir la vía (absoluta) completa desde el directorio raíz hasta el archivo en concreto. Puede empezar desde el directorio actual. Diríjase al directorio personal directamente con ~. Esto quiere decir que hay dos formas de mostrar el archivo Archivoprueba en el directorio test: introduciendo la vía relativa con ls test o especificando la vía absoluta con ls ~/test.

Para mostrar los contenidos de los directorios personales de los otros usuarios, introduzca ls ~nombre_usuario. En el árbol de directorios de ejemplo, unos de los usuarios de muestra es tux. En este caso, ls ~tux mostraría los contenidos del directorio personal de tux.

Para referirse al directorio actual, utilice un punto (.). El siguiente nivel superior en el árbol está representado por dos puntos (..). Al introducir ls .., verá los contenidos del directorio padre correspondientes al directorio actual. El comando ls ../.. muestra los contenidos del directorio dos niveles por encima en la jerarquía.

27.1.4.1. Segundo ejemplo: trabajo con vías

A continuación se muestra otro ejemplo para ilustrar cómo moverse por los directorios del sistema SUSE Linux.

  1. Cambie al directorio personal mediante el comando cd. Después cree un directorio en él con el nombre test2 introduciendo mkdir test2.

  2. Cambie al nuevo directorio con cd test2 y cree un subdirectorio con el nombre subdirectorio. Para acceder a él, use la función de expansión: escriba cd su y luego pulse Tabul. La shell recuperará el resto del nombre del directorio.

  3. Ahora intente mover el archivo creado previamente Copiaprueba al directorio actual (subdirectorio) sin cambiar de directorio de nuevo. Para conseguirlo, especifique la vía relativa a ese archivo: mv ../../test/Copiaprueba . (tenga en cuenta el punto al final). El punto al final de este comando es necesario para indicar a la shell que el directorio actual es el destino al que desea mover el archivo. ../../, en este ejemplo, se refiere al directorio personal.

27.1.5. Comodines

Otra característica que ofrece la shell son los comodines para la expansión del nombre de la vía. 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.

27.1.6. Less y More

Linux incluye dos pequeños programas para ver archivos de texto directamente en la shell. 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 27.1.7, “Conductos y redirección”.

27.1.7. Conductos y redirección

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. Para remitir la salida de un comando a una aplicación como less, use un conducto.

Para ver los archivos del directorio test, escriba el comando ls test | less. Los contenidos del directorio test se mostrarán con 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.

También es posible guardar la salida de comandos en un archivo. Por ejemplo, echo "test uno" > Contenido genera un nuevo archivo denominado Contenido que incluye las palabras test uno. Vea el archivo con less Contenido.

También puede usar un archivo como la entrada de un comando. Por ejemplo, con tr se sustituyen caracteres desde una entrada estándar que se ha redirigido desde el archivo Contenido y se escribe el resultado en una salida estándar: sustituir t con x llamando tr t x < Contenido. La salida de tr se envía a la pantalla.

Si necesita un archivo nuevo que contenga la salida, con la ayuda de un conducto lleve la salida de tr a un archivo. Para comprobarlo, cambie a test e introduzca el comando tr t x < ../Contenido > nuevo. Finalmente, vea nuevo con less nuevo.

Al igual que la salida estándar, la salida de error estándar se enviará a la consola. Sin embargo, para redirigir la salida de error estándar a un archivo denominado errores, añada al final 2> errores al comando correspondiente. Tanto la salida como el error estándar se guardarán en un archivo denominado todasalida si añade al final >& todasalida. Finalmente, para unir la salida de un comando a un archivo ya existente, el comando debe ir seguido de >> en lugar de >.

27.1.8. 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 denominadoarchivoprueba.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 comandogunzip. Introduzca gunzip archivoprueba.tar.gz, que dará como resultado el archivo archivoprueba.tar, que deberá extraerse o descomprimirse el archivo 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.

27.1.9. mtools

mtools es un conjunto de comandos para trabajar con sistemas de archivos MS-DOS. Los comandos incluidos en mtools le permiten dirigirse a la primera unidad de disquetes como a:, igual que en MS-DOS. Los comandos son como los de MS-DOS excepto en el hecho de que llevan delante una m.

mdir a:

Muestra el contenido del disquete de la unidad a:

mcopy Archivoprueba a:

Copia el archivo Archivoprueba en el disquete

mdel a:Archivoprueba

Suprime Archivoprueba en a:

mformat a:

Da formato al disquete con formato de MS-DOS (mediante el comando fdformat)

mcd a:

Hace que a: sea el directorio actual

mmd a:test

Crea el subdirectorio test en un disquete

mrd a:test

Suprime el subdirectorio test del disquete

27.1.10. 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 27.3, “Comandos importantes de Linux”, encontrará una lista de los comandos más importantes y una breve descripción de sus funciones.