Capítulo 1. Tutoriales de GNU/Linux

Tabla de contenidos

1.1. Introducción a la consola
1.1.1. El cursor del intérprete de comandos
1.1.2. El intérprete de órdenes bajo X
1.1.3. La cuenta de superusuario (root)
1.1.4. El cursor del intérprete de órdenes de superusuario
1.1.5. Herramientas gráficas para la administración del sistema
1.1.6. Consolas virtuales
1.1.7. Cómo cerrar el intérprete de órdenes
1.1.8. Cómo apagar el sistema
1.1.9. Cómo recuperar la configuración normal de una consola
1.1.10. Paquetes complementarios recomendados para usarios sin experiencia
1.1.11. Una cuenta de usuario adicional
1.1.12. Configuración de sudo
1.1.13. Hora de jugar
1.2. Sistema de archivos tipo Unix
1.2.1. Información básica sobre archivos en Unix
1.2.2. Sistemas de archivos internos
1.2.3. Permisos del sistema de archivos
1.2.4. Gestión de permisos para nuevos archivos: umask
1.2.5. Permisos para grupos de usuarios (grupo)
1.2.6. Sellos de tiempo
1.2.7. Enlaces
1.2.8. Tuberías con nombre (FIFOs)
1.2.9. "Sockets"
1.2.10. Archivos de dispositivos
1.2.11. Archivos de dispositivos especiales
1.2.12. procfs y sysfs
1.2.13. tmpfs
1.3. Midnight Commander (MC)
1.3.1. Personalización de MC
1.3.2. Empezando a usar MC
1.3.3. Gestión de archivos con MC
1.3.4. Trucos de la línea de órdenes en MC
1.3.5. El editor interno de MC
1.3.6. El visor interno de MC
1.3.7. MC y sus funciones de inicialización
1.3.8. Sistema de archivos virtual FTP de MC
1.4. El entorno de trabajo fundamental tipo Unix
1.4.1. The login shell
1.4.2. Personalizando "bash"
1.4.3. Combinaciones de teclas especiales
1.4.4. Operaciones con el ratón al estilo Unix
1.4.5. El paginador
1.4.6. El editor de texto
1.4.7. Configurando el editor de texto por defecto
1.4.8. Personalizando vim
1.4.9. Grabando las actividades de los intérpretes de órdenes
1.4.10. Órdenes básicas de Unix
1.5. Órdenes simples del intérpete de órdenes
1.5.1. Ejecución de órdenes y variables de entorno
1.5.2. La variable "$LANG"
1.5.3. La variable "$PATH"
1.5.4. La variable "$HOME"
1.5.5. Opciones de la línea de órdenes
1.5.6. Expansión en el intérprete de órdenes
1.5.7. Valor de retorno de la órden
1.5.8. Secuencias de órdenes comunes y redirecciones del intérprete de órdenes
1.5.9. Alias de órdenes
1.6. Procesamiento de texto al estilo Unix
1.6.1. Herramientas de texto Unix
1.6.2. Expresiones regulares
1.6.3. Sustitución de expresiones
1.6.4. Sustituciones globales con expresiones regulares
1.6.5. Extrayendo datos de la tabla de archivos de texto
1.6.6. Fragmentos de archivos de órdenes para órdenes entubadas

Aprender a usar un sistema informático es como aprender un idioma nuevo. Aunque los libros de ayuda y la documentación son útiles, uno debe practicarlo personalmente. Para ayudarle a comenzar sin tropiezos, he escrito unos pocos puntos básicos.

El poderoso diseño de Debian GNU/Linux viene del sistema operativo Unix, un sistema operativo multiusuario y multitarea. Debe aprender a aprovechar el poder de estas características y las similitudes entre Unix y GNU/Linux.

No rehuya los textos orientados a Unix y no se base únicamente en textos sobre GNU/Linux, ya que esto le impediría acceder a mucha información útil.

[Nota] Nota

Si usted ha utilizado cualquier sistema tipo Unix durante algún tiempo con las herramientas de línea de órdenes, probablemente ya conozca todo lo que explico aquí. Por favor, use esto para comprobar los detalles y como recordatorio.

Si no ha instalado el Sistema de Ventanas X con un gestor de inicio de sesión como gdm3, al iniciar el sistema se le presenta la pantalla de identificación en modo texto. Suponiendo que el nombre de su equipo sea foo, la pantalla de identificación tendrá el aspecto siguiente:

foo login:

Si ha instalado un entorno gráfico de usuario (GUI) como GNOME o KDE, podrá acceder a una pantalla de identificación en modo texto pulsando Ctrl-Alt-F1, y podrá regresar al modo gráfico pulsando Alt-F7 (vea Sección 1.1.6, “Consolas virtuales” de lo que daremos detalles más adelante).

En el diálogo de entrada escriba su nombre de usuario, p. ej. pingüino, y pulse la tecla Intro, a continuación escriba su contraseña y pulse Intro otra vez.

[Nota] Nota

De acuerdo a la tradición Unix, el nombre de usuario y la contraseña en un sistema Debian son sensibles a mayúsculas. El nombre de usuario normalmente se elige de tal modo que esté compuesto únicamente por minúsculas. La primera cuenta de usuario normalmente se crea durante la instalación. El superusuario (root) puede crear cuentas de usuario adicionales con la orden adduser(8).

El sistema empieza mostrando el mensaje de bienvenida almacenado en "/etc/motd" (Mensaje del día) y muestra un cursor para realizar la petición de órdenes.

Debian GNU/Linux jessie/sid foo tty1
foo login: penguin
Password:
Last login: Mon Sep 23 19:36:44 JST 2013 on tty3
Linux snoopy 3.11-1-amd64 #1 SMP Debian 3.11.6-2 (2013-11-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
foo:~$

La mayor parte del mensaje de bienvenida puede ser personalizada editando el archivo "/etc/motd.tail". La primera línea se genera a partir de la información del sistema utilizando "uname -snrvm".

Ahora nos encontramos en el interprete de órdenes (shell). La shell interpreta las órdenes del usuario.

Si usted instaló el Sistema de Ventanas X con un gestor de inicio de sesión como gdm3 de GNOME al seleccionar la tarea "Entorno de escritorio" durante la instalación, se le presentará la pantalla de inicio de sesión cuando arranque su sistema. Podrá escribir ahí su nombre de usuario y su contraseña para acceder a la cuenta de usuario sin privilegios. Puede utilizar el tabulador para alternar entre el nombre de usuario y la contraseña, o utilizar el ratón pulsando su butón principal.

Puede obtener un interprete de órdenes en un entorno de trabajo gráfico abriendo un programa x-terminal-emulator como gnome-terminal(1), rxvt(1) o xterm(1). Si usa el entorno de escritorio Gnome para abrir un intérprete de órdenes debe hacer clic en "Aplicaciones" → "Accesorios" → "Terminal".

Usted puede ampliar la información en la sección Sección 1.1.6, “Consolas virtuales”.

En algunos entornos de escritorio (como fluxbox), no existe un punto de acceso al menú tal cual. Si se encuentra en este caso, simplemente pruebe a hacer clic con el (botón derecho del ratón) sobre el fondo de escritorio y surgirá un menú.

La cuenta de root también es conocida como superusuario o usuario privilegiado. Con esta cuenta podrá llevar a cabo las siguientes tareas administrativas:

  • Leer, escribir y borrar cualquier archivo del sistema independientemente de los permisos de dicho archivo

  • Cambiar la propiedad y los permisos de cualquier archivo del sistema

  • Cambiar la contraseña de cualquier usuario sin privilegios del sistema

  • Entrar en la cuenta de cualquier usuario sin usar su contraseña

El poder ilimitado de la cuenta de superusuario necesita de un uso basado en la consideración y la responsabilidad.

[Aviso] Aviso

Nunca comparta la contraseña del superusuario con nadie.

[Nota] Nota

Los permisos de acceso a un archivo (incluidos los dispositivos como un CD-ROM u otros, que son simplemente otro archivo para el sistema Debian) pueden hacer que sea inaccesible a los usuarios distintos del superusuario. Aunque el uso de la cuenta de superusuario es una manera rápida de comprobar este tipo de situaciónes, resolverlas es algo que debe hacerse estableciendo adecuadamente los permisos del archivo y la lista de usuarios que pertenece a cada grupo (véase Sección 1.2.3, “Permisos del sistema de archivos”).

Si el menú de su escritorio no inicia las herramientas gráficas de administración del sistema con los permisos adecuados automáticamente, puede iniciarlas desde el intérprete de órdenes del superusuario deun emulador de terminal de X como gnome-terminal(1), rxvt(1), o xterm(1). Vea Sección 1.1.4, “El cursor del intérprete de órdenes de superusuario” y Sección 7.8.5, “Ejecutando clientes X como superusuario”.

[Aviso] Aviso

Nunca inicie una sesión gráfica con la cuenta de superusuario escribiendo root en el cuadro de diálogo de un gestor de inicio de sesión como gdm3(1).

[Aviso] Aviso

Nunca ejecute programas gráficos remotos no confiables en el sistema de ventanas X cuando se esté mostrando información crítica, porque dichos programas pueden realizar una intercepción pasiva de toda su pantalla de X.

En el sistema Debian que se instala por defecto hay seis consolas tipo VT100 intercambiables, disponibles para iniciar un intérprete de órdenes directamente en el equipo Linux. A menos que se encuentre en un entorno gráfico, podrá cambiar entre ellas presionando simultáneamente la tecla Alt situado en la izquierda y una de las teclas F1F6. Cada consola en modo texto permite acceder independientemente a la cuenta y acceder a un entorno multiusuario. Este entorno multiusuario es una gran característica de Unix, y es muy adictivo.

Si se encuentra en el Sistema de Ventanas X, puede acceder a la primera consola de texto presionando Ctrl-Alt-F1, es decir, la tecla Ctrl situada a la izquierda, la tecla Alt situada a la izquierda y la tecla F1 pulsadas simultáneamente. Puede volver al Sistema de Ventanas X, que normalmente se encontrará en la consola virtual 7, presionando Alt-F7.

También puede cambiar a otra consola virtual, p. ej. a la consola 1, desde el intérprete de órdenes.

# chvt 1

Como en cualquiero otro Sistema Operativo moderno donde el trabajo con archivos implica usarmemorias caché de los datos para mejorar la eficiencia, el sistema Debian necesita que se efectúe el procedimiento de cierre de forma correcta antes de que se pueda cortar la corriente con seguridad. Esto es así para mantener la integridad de los archivos, obligando que todos los cambios que están en la memoria se escriban al disco. Si hay activo algún programa de control de energía, el procedimiento de cierre apagará el sistema automáticamente (en otro caso, tendrá que apretar el botón de encendido durante unos segundos).

Puede apagar el sistema en el modo multiusuario estándar desde el intérprete de órdenes:

# shutdown -h now

Puede apagar el sistema en el modo monousuario desde el intérprete de órdenes:

# poweroff -i -f

Otro forma de conseguirlo es pulsar Ctrl-Alt-Suprimir (la tecla Ctrl de la izquierda, la tecla Alt de la izquierda, y la tecla Supr al mismo tiempo) para apagar si "/etc/inittab" contiene "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now". Vea inittab(5) para más detalles.

Vea Sección 6.9.6, “Apagar un sistemas remoto utilizando SSH”.

Una instalación mínima del sistema Debian sin ningún entorno de escritorio proporciona la funcionalidad básica de Unix, sin embargo es una buena idea instalar algunos paquetes de terminal de caracteres adicionales basados en curses o en modo texto como mc y vim mediante la órden apt-get(8) para que los nuevos usuarios empiecen a tener experiencia con lo siguiente.

# apt-get update
 ...
# apt-get install mc vim sudo
 ...

Si los paquetes antes mencionados están instalados con anterioridad, no se instalará ningún paquete nuevo.


Puede ser una buena idea que usted leyera algo de documentación útil.


Puede instalar algunos de estos paquetes haciendo:

# apt-get install nombre_del_paquete

Para una estación de trabajo típica de un único usuario o un escritorio Debian en un portátil, es normal realizar una configuración sencilla de sudo(8) como se indica a continuación para permitir al usuario no privilegiado, p. ej. pinguino, obtener los privilegios administrativos simplemente con su contraseña de usuario sin utilizar la contraseña del superusuario.

# echo "pinguino  ALL=(ALL) ALL" >> /etc/sudoers

También es usual hacerlo de la siguiente manera para permitir al usuario no privilegiado, p. ej. pinguino, ganar los privilegios administrativos sin usar ninguna contraseña:

# echo "pinguino  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Este truco solamente se debe usar en una estación de trabajo con un único usuario en la que usted sea el administrador y usuario único.

[Aviso] Aviso

No establezca de esta manera privilegios para cuentas de usuarios no privilegiados en una estación de trabajo multiusuario porque es perjudicial para la seguridad del sistema.

[Atención] Atención

La contraseña de la cuenta pinguino, en los ejemplos de arriba, requiere tanta protección como la contraseña del superusuario.

[Atención] Atención

Los privilegios administrativos pertenecen a alguien autorizado a realizar tareas de administración del sistema en la estación de trabajo. Nunca le de a un administrador del departamento de Sistemas de su compañía ni a su jefe tales privilegios a menos que estén autorizados y sean capaces.

[Nota] Nota

Para proporcionar privilegios de acceso a determinados dispositivos y determinados archivos debería considerar usar grupos para proporcionar acceso limitado en lugar de utilizar los privilegios de superusuario vía sudo(8).

[Nota] Nota

Con una configuración mejor pensada y cuidadosa, sudo(8) puede proporcionar privilegios administrativos limitados a otros usuarios en un sistema compartido sin compartir la contraseña de superusuario. Esto puede ayudar en el mantenimiento de un sistema con múltiples administradores de manera que usted pueda saber quién hizo qué. Por otra parte, puede preferir que nadie más tenga tales privilegios.

En GNU/Linux y otros sistemas operativos tipo Unix, los archivos se organizan en directorios. Todos los archivos y directorios están ordenados en un gran árbol que tiene como raíz "/". Se le llama árbol porque si se dibuja el sistema de archivos, parece un árbol pero cabeza abajo.

Estos archivos y directorios pueden distribuirse entre varios dispositivos. mount(8) se utiliza para añadir el sistema de archivos que se encuentra en un dispositivo al gran árbol de archivos. Inversamente, umount(8) lo desconecta del gran árbol de archivos. En los núcleos más recientes de Linux, mount(8), con determinadas opciones, puede unir parte de un sistema de ficheros en otro sitio del árbol o puede montar un sistema de archivos como compartido, privado, esclavo o no enlazable. Las opciones soportadas para cada sistema de ficheros están disponibles en "/share/doc/linux-doc-*/Documentation/filesystems/".

Los directorios de los sistemas Unix son llamados carpetas en otros sistemas. Por favor, note que no existe el concepto de unidad como "A:" en ningún sistema Unix. Solamente hay un sistema de archivos, y todo se encuentra en él. Esto es una gran ventaja en comparación con Windows.

Aquí damos algo de información básica sobre los archivos en Unix.

[Nota] Nota

Es posible usar casi cualquier letra o simbolo en el nombre de un archivo, pero en la práctica es una mala idea. Es preferible evitar el uso de cualquier carácter que tenga un significado especial para el intérprete de órdenes, incluido espacioes, tabulaciones, o saltos de línea, y otros carácteres especiales: { } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $ . Si usted desea separar palabras en un nombre, una buena elección es el punto, el guión y el guión bajo. Además puede empezar cada palabra con mayúscula, "LikeThis". Los usuarios con experiencia suelen evitar los espacios en los nombres de archivo.

[Nota] Nota

La palabra "root" puede significar "superusuario" o "directorio raíz". El contexto determinará su significado correcto.

[Nota] Nota

El término ruta no solo se usa para los nombres de archivos completamente cualificados como hemos hecho en los párrafos anteriores, si no en la ruta para la búsqueda de órdenes. El significado correcto será determinado por el contexto.

Los detalles de las buenas prácticas de la jerarquía de archivos es descita en el Estándar de Jerarquía del Sistema de Archivos (Filesystem Hierarchy Standard ) ("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz" yhier(7)). Es importante que recuerde esto como fundamental.


Siguiendo la tradición de Unix, el sistema Debian GNU/Linux ofrece sistemas de archivos sobre los cuales los datos físicos se almacenan en discos duros u otros dispositivos de almacenamiento, y la interacción con esos dispositivos hardware como las consolas en modo texto y consolas en serie remotas son representadas de una manera unificada en "/dev/".

Cada archivos, directorio o tubería con nombre (una manera en que dos programas pueden compartir datos), o dispositivos físicos en el sistema Debian GNU/Linux tiene una estructura de información llamada un inodo el cual describe sus atributos como quién es su dueño (owner), el grupo al que pertenece, la fecha de último acceso, etc. Si esta muy interesado, vea "/usr/include/linux/fs.h" para la definición exacta de la "estructura de un inodo" en el sistema in the Debian GNU/Linux. La idea de representar todo a través de archivos fue una innovación de Unix, y las versiones modernas de los núcleos de Linux la han llevado más allá. En nuestro días, en el sistema de archivos puede encontrar información de procesos en ejecución en el equipo.

La representación unificada y abstracta de entidades físicas y procesos internos es sumamente útil ya que permite el uso de la misma órden para el mismo tipo de operación en dispositivos totalmente diferentes. Incluso es posible cambiar la forma de trabajar del núcleo escribiendo datos en archivos especiales que están enlazandolos a procesos en ejecución.

[Sugerencia] Sugerencia

Si usted necesita determinar la correspondencia entre un árbol de archivos y un elemento físico, ejecute mount(8) sin parámetros.

Los permisos en el sistema de archivos de los sistemas tipo Unix definen tres categorías o tipos de usuarios.

  • El usuario que es dueño del archivo (u)

  • Los usuarios que pertenecen al grupo al que pertenece el archivo (h)

  • El resto de usuarios (o) también denominados "universo" o "todos"

En cada archivo, cada permiso permite las siguientes acciones.

  • El permiso de lectura (r) permite al dueño examinar el contenido del archivo.

  • El permiso de escritura (w) permite al dueño modificar el archivo.

  • El permiso de ejecución (x) permite al dueño ejecutar el archivo como una órden.

Para los directorios, cada permiso permite las siguientes acciones.

  • El permiso de lectura (r) permite al dueño enumerar el contenido del directorio.

  • El permiso de escritura (w) permite al dueño añadir o borrar archivos al directorio.

  • El permiso de ejecución (x) permite al dueño acceder a los archivos del directorio.

Los permisos de ejecución de un directorio no solo indican que se puede leer los archivos que contiene, si no también permite ver sus atributos, como el tamaño y la fecha de modificación.

ls(1) se usa para mostrar los permisos (y más detalles) de archivos o directorios. Cuando se ejecuta con el parámetro "-l", muestra la información siguiente ordenada por campos.

  • tipo de fichero (primer carácter)

  • Permisos de acceso al archivo (nueve caracteres, tres para el usuario, otros tres para el grupo y los tres últimos para el resto, en este orden)

  • Número de enlaces duros al archivo

  • Nombre del usuario que es dueño del archivo

  • Nombre del grupo al que pertenece

  • Tamaño del archivo expresado en caracteres (bytes)

  • Fecha y hora del archivo (mtime)

  • Nombre del archivo


Para cambiar el dueño de un archivo, el superusuario usa la órden chown(1). Para cambiar el grupo del archivo, el dueño de un archivo usa la órden chgrp(1). Para modificar los permisos del acceso al archivo o directorio, el dueño o el superusuario usa la órden chmod(1). La sintaxis para operar sobre un archivo foo es la siguiente.

# chown <nuevo_dueño> foo
# chgrp <nuevo_grupo> foo
# chmod  [ugoa][+-=][rwxXst][,...] foo

Por ejemplo, se puede asignar a un árbol de directorios como dueño al usuario foo y como grupo bar siguiendo.

# cd /some/location/
# chown -R foo:bar .
# chmod -R ug+rwX,o=rX .

Existen tres permisos especiales que corresponden con los bits.

  • El bit set user ID (s or S en lugar del permiso del dueñox)

  • El bit set group ID (s or S en lugar del permiso del group x)

  • El bit sticky (t or T en vez del permiso del resto x)

Estos bits aparecerán en mayúsculas en la salida obtenida por la órden "ls -l" si los permisos de ejecución correspondientes estan sin marcar.

La configuración de set user ID en un archivo ejecutable permite a un usuario ejecutarlo con todos los privilegios de su dueño (al ejecutarlo con el identificador del dueño), (por ejemplo root). Igualmente la configuración set group ID en un archivo ejecutable permite al usuario ejecutarlo con todos los privilegios de su grupo (al ejecutarlo con el identificador del grupo) (por ejemplo root). Esto provoca riesgos de seguridad, por lo que su configuración debe ser extremadamente cuidadosa.

La configuración del bit set group ID en un directorio permite los esquemas de creación de archivosal estilo BSD, donde todos los archivos creados en el directorio pertenecen al mismo grupo que el directorio.

La configuración del "sticky bit" en un directorio evita que los archivos que contiene sean eliminados por alguien diferente a su dueño. En los directorios con permisos de escritura para todos, como "/tmp", o para el grupo, con el fin de asegurar la integridad de los archivos, no solo se debe eliminar los permisos de escritura de los archivos. Además se debe configurar el sticky bit del directorio para evitar que cualquier usuario con permisos de escritura en él pueda borrar un archivo y después crear otro con el mismo nombre.

Aquí mostramos algunos ejemplos interesantes.

$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
-rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
-rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
-rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
drwxrwxrwt  3 root root   4096 Oct 16 21:20 /var/tmp

La órden chmod(1) posee otro método de carácter numérico para describir los permisos de un archivo. Este modo numerico usa 3 o 4 digitos en base octal (base 8).


Parece más complicado de lo que realmente es. Si mira la primeras columnas(de la 2 a la 10) de la salida de la órden "ls -l" y lee en binario (base 2) la representación de los permisos del archivo ("-" siendo "0" y "rwx" siendo un "1"), los tres últimos dígitos del modo numérico tendrán sentido como una representación en octal (base 8) de los permisos del archivo.

Por ejemplo, intente lo siguiente

$ touch foo bar
$ chmod u=rw,go=r foo
$ chmod 644 bar
$ ls -l foo bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo
[Sugerencia] Sugerencia

Si necesita acceder a información de salida de la órden "ls -l" en un archivo de órdenes, es recomendable usar las órdenes correctas como test(1), stat(1) y readlink(1). La funcionalidad del intérprete de órdenes como"[" or "test" puede ser usada también.

Para que los permisos de un grupo se apliquen a un usuario, el necesario añadir el usuario al grupo usando "sudo vigr" para editar /etc/group y "sudo vigr -s" para editar /etc/gshadow. Para que se active la nueva configuración de grupos es necesario cerrar la sesión e iniciarla (o ejecutar exec newgrp").

[Nota] Nota

Otra manera de hacerlo de forma dinámica es añadir usuarios a grupos durante el proceso de autenticación añadiendo la línea auth optional pam_group.so" al archivo "/etc/pam.d/common-auth" y configurar "/etc/security/group.conf". (Lea Capítulo 4, Acreditación.)

En el sistema de Debian los dispositivos hardware son otro tipo de archivos. Si tiene problemas para que un usuario acceda a dispositivos como el CD-ROM y llaveros USB, podría añadir el usuario al grupo pertinente.

Algunos grupos importantes proporcionados por el sistema permiten a sus miembros acceder a archivos y directorios específicos sin privilegios de superusuario.


[Sugerencia] Sugerencia

Necesita pertenecer al grupo dialout para reconfigurar el modem, marcar, etc. Pero si el superusuario crea archivos de configuraciones predefinidas para algunos pares en "/etc/ppp/peers/", únicamente necesitará pertenecer al grupo dip para crear conexiones a internet porvia telefónica a estos pares usando las órdenes pppd(8), pon(1), y poff(1).

Algunos grupos importantes proporcionados por el sistema permiten a sus miembros ejecutar determinadas órdenes sin privilegios de superusuario.


Una lista completa de los usuarios y grupos proporcionados por el sistema se puede consultar en la versión más reciente del documento "Users and Groups" /usr/share/doc/base-passwd/users-and-groups.html proporcinada por el paquete base-passwd.

Puede consultar las órdenes para la gestión de usuarios y grupos del sistema: passwd(5), group(5), shadow(5), newgrp(1), vipw(8), vigr(8), y pam_group(8).

Existen tres tipos de marcas o sellos de tiempo en un archivo GNU/Linux.


[Nota] Nota

ctime no es el momento de creación del archivo.

  • La sobreescritura de un archivo modifica sus propiedades de tiempo , mite, ctime, y atime.

  • El cambio de dueño o de permisos de un archivo modifica sus propiedades ctime y atime.

  • La lectura de un fichero modifica su propiedad de atime.

[Nota] Nota

Incluso la lectura de un archivo requiere una operación de escritura para actualizar la información referente a su atime que está contenida en el inodoinode. El montado de un sistema de archivos con las opciones "noatime" o "relatime" elimina dicha operación y mejora los tiempos de lectura de los archivos. A menudo, esta práctica es recomendada en portatiles, ya que reduce la actividad del disco duro y ahorra energía. Para más información consulte mount(8).

Use la órden touch(1) para cambiar las marcas de tiempo de los archivos existentes.

La órden ls muestra como salida, en lo referente a las marcas de tiempo, diferentes cadenas de caracteres si usa una configuración regional diferente de la inglesa ("fr_FR.UTF-8") como la antigua localización ("C").

$ LANG=fr_FR.UTF-8  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo
$ LANG=C  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
[Sugerencia] Sugerencia

Mire Sección 9.2.5, “Personalización de la visualización de la fecha y hora” para personalizar la salida de "ls -l".

Existen dos métodos para asociar un archivo "foo" con otro nombre "bar".

Con el siguiente ejemplo se muestra los cambios en el contador de enlaces y las sutiles diferencias de la órden rm.

$ umask 002
$ echo "Original Content" > foo
$ ls -li foo
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
$ ln foo bar     # hard link
$ ln -s foo baz  # symlink
$ ls -li foo bar baz
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
$ rm foo
$ echo "New Content" > foo
$ ls -li foo bar baz
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
$ cat bar
Original Content
$ cat baz
New Content

Los enlaces duros deben ser construidos en el mismo sistema de archivos y comparten el mismo "inodo" como revela el parámetro "-i" de la órden ls(1).

Los enlaces simbólicos siempre tienen permisos de acceso al archivo nominales "rwxrwxrwx", como se mostro en el ejemplo anterior, con los permisos reales que tenga el archivo al que apunta.

[Atención] Atención

En general es preferible no crear enlaces simbólicos o enlaces duros en ningún caso excepto que tenga poderosas razones. La combinación lógica de enlaces simbólico puede causar problemas graves al crear bucles en el sistema de archivos.

[Nota] Nota

En general es preferible crear enlaces simbólicos a enlaces duros, al menos que tenga alguna buena razón para lo contrario.

El directorio . enlaza al propio directorio en el que aparece, por lo que la cuenta de enlaces de cualquier nuevo directorio es 2. El directorio ".." enlaza al directorio padre, por lo que la cuenta de enlaces del directorio se incrementa con la creación de nuevos subdirectorios.

Si usted viene de Windows, pronto comprenderá lo bien diseñado que están los enlaces a archivos de Unix, comparados con su equivalente en Windows que son los accesos directos (shortcuts). Gracias a la implementación en el sistema de archivos, las aplicaciones no distinguen entre el archivo original y su enlace. En el caso de los enlaces duros, en verdad no existe diferencia.

Una tubería con nombrees un archivo que actua como una tubería. Usted pone algo dentro del archivo, y sale por el otro lado. Por esa razón es llamada un FIFO, o primero-en-entrar-primero-en-salir: la primera cosa que se pone en la tubería es la primera en salir por el otro lado.

Si se escribe en una tubería con nombre, los procesos que escriben en la tubería no pueden terminar hasta que la información que han escrito es leida de la tubería. Si se lee de una tubería con nombre, el proceso lector espera hasta que no hay nada que leer antes de terminar. El tamaño de la tubería es siempre cero --- no almacena datos, la tubería solo comunica los dos procesos de igual manera que se hace en el intérprete de órdenes mediante la sintaxis "|". Sin embargo, desde que la tubería tiene un nombre, los dos procesos no tienen que estar en la misma línea de órdenes y ni siquiera ser ejecutados por el mismo usuario. Las tuberías fueron una innovación muy relevante de Unix.

Por ejemplo, intente lo siguiente

$ cd; mkfifo mypipe
$ echo "hello" >mypipe & # put into background
[1] 8022
$ ls -l mypipe
prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
$ cat mypipe
hello
[1]+  Done                    echo "hello" >mypipe
$ ls mypipe
mypipe
$ rm mypipe

Los archivos de dispositivos referencian a disitivos físicos o virtuales del sistema, como el disco duro, la tarjeta de video, la pantalla o el teclado. Un ejemplo de dispositivo virtual es la consola, representado por "/dev/console".

Hay dos tipos de archivos de dispositivos.

  • Dispositivos orientados a carácter

    • Se accede a un carácter cada vez

    • 1 carácter = 1 byte

    • P. ej. teclado, puerto serie, …

  • Dispositivo orientado a bloque

    • Se accede a unidades mayores llamadas bloques

    • 1 bloque > 1 byte

    • P. ej. un disco duro, …

Los archivos de dispositivos se pueden leer y escribir , aunque el fichero puede contener datos binarios los cuales son un galimatias incomprensibles para humanos. Algunas veces escribir datos directamente en esos ficheros puede ayudar a resolver problemas de conexión con los dispositivos. Por ejemplo, usted puede enviar un archivo de texto al dispositivo de la impresora"/dev/lp0" o mandar órdenes de modem por el puerto serie "/dev/ttyS0". Pero, al menos que se haga con cuidado, puede causar un problema mayor. Así que tenga cuidado.

[Nota] Nota

Comúnmente a la impresora se accede usando lp(1).

El número de nodo del dispositivo se muestra por la ejecución de ls(1) como sigue.

$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero
  • "/dev/sda" tiene como número de disposito mayor 8 y como número de dispositivo menor 0. Es accesible para lectura/escritura haciendo que los usuarios pertenezcan al grupodisk.

  • "/dev/sr0" tiene como número de dispositivo mayor 11 y como menor 0. Es accesible para las operaciones de escritura/lectura haciendo que el usuario pertenezca al grupo cdrom.

  • "/dev/ttyS0" tiene el número de dispositivo mayor 4 y menor 64. Es accesible para lectura/escritura haciendo que el usuario pertenezca al grupo dialout.

  • "/dev/zero" tiene como número mayor de dispositivo 1 y como menor 5. Es accesible para lectura/escritura para todos.

En los sistemas modernos Linux, el sistema de archivos bajo "/dev/" se rellena de forma automática por el mecanismo udev(7).

Los pseudo sistemas de archivos procfs y sysfs se montan en "/proc" y "/sys" y muestran estructuras de datos internas del núcleoal espacio de usuario. Expresado de otra forma, estas entradas son virtuales, actuando como una ventana apropiada a la operativa del sistema operativo.

El directorio "/proc" contiene (entre otras cosas) un subdirectorio por cada proceso que ha sido creado en el sistema operativo, cuyo nombre es el identificador del proceso (PID). Las herramientas del sistema que acceden a la información del proceso, como ps(1), obtiene dicha información de la estructura de este directorio.

Los directorios por debajo de "/proc/sys/" contienen interfaces que permiten cambiar algunos parámetros del núcleo en tiempo de ejecución. (Se puede conseguir lo mismo a través de la órdensysctl(8) o de su archivo de precarga/configuración"/etc/sysctl.conf".)

La gente normalmente se alarma cuando se dan cuenta que un archivo en particular - "/proc/kcore" - es extremadamente grande. Es (más o menos) una copia del contenido de la memoria del equipo. Se usa para depurar el kernel. Es un archivo virtual que apunta a la memoria del equipo, así es que no se preocupe por su tamaño.

El directorio que cuelga de "/sys" contiene las estructuras de datos del kernel exportadas, sus atributos, y las conexiones entre ellos.

Vea "proc.txt(.gz)", "sysfs.txt(.gz)" y otros documentos que forman parte de la documentación del kernel de Linux("/usr/share/doc/linux-doc-*/Documentation/filesystems/*") que están en el paquete linux-doc-*.

El sistema de archivos temporal tmpfs tiene la función de mantener todos los archivos en lamemoria virtual. Los datos de "tmpfs" en la caché de páginas en la memoria puede ser expulsada alalmacenamiento swap en disco cuando sea necesario.

El directorio "/run" se monta como el tmpfs al comienzo del proceso de arranque. Así se permite la escritura sobre él, incluso cuando el directorio "/" es montado en solo lectura. Aquí se guardad los archivos en estado temporal y sustituye a varios lugares descritos en Jerarquía Estándar del Sistema de Ficheros version 2.3:

  • "/var/run" → "/run"

  • "/var/lock" → "/run/lock"

  • "/dev/shm" → "/run/shm"

Vea el documento del núcleo de Linux"tmpfs.txt(.gz)" ("/usr/share/doc/linux-doc-*/Documentation/filesystems/*") que esta en el paquete linux-doc-*.

Midnight Commander (MC) es una "navaja multiusos" GNU para la consola de Linux y otros entornos de terminal. Aporta a los nuevos usuarios una experiencia de consola conducida por menús que es mucho más fácil de aprender que las órdenes de Unix estándar.

Usted necesitará instalar el paquete de "Midnight Commander" llamado "mc como sigue.

$ sudo apt-get install mc

Al usar la órdenmc(1) podrá explorar el sistema Debian. Esta es la mejor forma de aprender. Por favor, visite unos cuantos lugares de interés usando las teclas de cursos y la tecla "Intro".

  • "/etc" y sus subdirectorios

  • "/var/log" y sus subdirectorios

  • "/usr/share/doc" y sus subdirectorios

  • "/sbin" y "/bin"

El editor interno tiene un esquema de corta-y-pega interesante. Al pulsarF3 comienza la selección, una segunda pulsación de F3 finaliza la selección y resalta lo seleccionado. Entocnes se puede mover el cursor. Si presiona F6, el aŕea seleccionada se moverá a la posición del cursor. Si presiona F5, el área seleccionadad se copia e inserta en la posición del cursor.. F2 guarda el archivo. F10 permite salir del editor. La mayor parte de las teclas cursor funcionan de forma intuitiva.

El editor puede abrise directamente con un archivos usando una de las siguientes órdenes:

$ mc -e nombre_de_archivo_a_editar
$ mcedit nombre_de_archivo_a_editar

El editor posee una sola ventana, pero se pueden usar varias consolas de Linux para obtener el mismo comportamiento. Para copiar entre ventanas, use las teclas Alt-F<n> para cambiar entre consolas virtuales y use "File→Insert file" or "File→Copy to file" para mover una parte de un archivo a otro.

El editor interno puede ser reemplazado por cualquier otro editor de su elección.

De hecho, muchos programas usan la variable de entorno "$EDITOR" o "$VISUAL" para determinar el editor a usar. Si no está cómodo al principio con vim(1) o nano(1) , puede cambiar su valor a "mcedit" añadiendo la siguientes líneas a"~/.bashrc".

export EDITOR=mcedit
export VISUAL=mcedit

Si es posible, mi recomendación es asignar el valor "vim".

Si no se siente cómodo usando vim(1), puede usarmcedit(1) para la mayor parte de las tareas de mantenimiento del sistema.

Aunque MC permite realizar casi cualquier cosa, es importante que usted aprenda cmo se usa la línea de órdenes invocada desde el cursor del intérprete de órdenes y acostumbrarse con el entorno de trabajo tipo Unix.

Usted debería ser competente en alguno de los programas Vim o Emacs los cuales son comunes en lso sistemas tipo Unix.

Pienso que lo correcto es acostumbrarse a las órdenes de Vim, ya que el editor Vi esta siempre disponible en el mundo Linux/Unix. (En realidad, los programas, bien el original vi o el nuevonvi los puede encontrar en cualquier lugar. Yo elegí Vim en vez de la vesrsión nueva ya que ofrece ayuda a través de tecla F1 mientras es muy parecido y más potente.)

Si elige cualquiera de los dos Emacs o XEmacs como su editor, es una buena opción ciertamente, especialemente para la programación. Emacs tiene una extensa cantidad de características también, incluyendo funciones como lector de noticias, editor de directorios, aplicación de correo, etc. Cuando se usa para programar o editar archivos de órdenes, reconocerá el formato en el que está trabajando, y tratará de ayudarle. Algunos mantienen que el único programa que necesita Linux es Emacs. Aprender Emacas durante diez minutos ahora puede ahorrar muchas horas después. Tener el manual de GNU Emacs como fuente cuando se aprende es altamente recomendable.

Todos estos programas normalmente incluyen una aplicación de tutorial para que usted pueda aprender a través de la practica. Se inicia Vim escribiendo "vim" y presione la tecla F1. Usted debería al menos leer las priemeras treinta y cinco líneas. Entonces realizar el curso de entrenamiento posicionando el cursor en"|tutor|" y pulsando Ctrl-].

[Nota] Nota

Los buenos editores, como Vim y Emacs, gestionan de manera adecuada codificaciones UTF-8 y otras menos comunes o más exóticas. Es una buena ideas usar el entorno X con la configuración regional UTF-8 e instalar los programas y tipos de letra necesarias para ello. Los editores tienen opciones para asignar una codificación independientemente de la del entorno X. Por favor, consulte su documentación para texto de varios bytes.

Aprendamos las órdenes fundamentales de UNIX. En este caso usaré "Unix" en su sentido genérico. Cualquier sistema operativo clon de Unix normalmente brinda órdenes equivalentes. El sistema Debian no es una excepción. No se preocupe si algunas órdenes no funcionan ahora como esperaba. Si se usa alias en el intérprete de órdenes, sus salidas de las órdenes correspondientes son diferentes. Estos ejemplos no están preparados para ejecutarse en este órden.

Pruebe las siguientes órdenes desde una cuenta de usuario no privilegiado.

Tabla 1.16. Lista de órdenes Unix fundamentales

orden descripción
pwd muestra el nombre del directorio actual/de trabajo
whoami muestra el nombre del usuario actual
id muestra la identidad del usuario actual (nombre, uid, gid, y grupos a los que pertenece)
file <foo> muestra el tipo de archivo para el archivo "<foo>"
type -p <nombre_de_la_órden> muestra la ubicación del archivo de la órden "<nombre_de_la_órden>"
which <nombre_de_la_órden> , ,
type <nombre_de_la_órden> muestra información de la órden "<nombre_de_la_órden>"
apropos <palabra_clave> encuentra órdenes familiarizadas con la "<palabra_clave>"
man -k <palabra_clave> , ,
whatis <nombre_de_la_órden> muestra una descripción en una línea de la órden "<nombre_de_la_órden>"
man -a <nombre_de_la_órden> muestra la descripción de la órden "<nombre_de_la_orden>" (al estilo Unix)
info <nombre_de_la_órden> muestra una descripción bastante larga de la óden "<nombre_de_la_órden>" (al estilo GNU)
ls enumera el contenido del directorio (excluye aquellos archivos o directorios que comienzan por .)
ls -a enumera el contenido del directorio (todos los archivos y directorios)
ls -A enumera el contendido del directorio (casi todos los archivos y directorios, a saber, oculta ".." y ".")
ls -la enumera todo el contenido del directorio con información detallada
ls -lai enumera todo el contenido del directorio con el número del inodo e información detallada
ls -d enumera todos los directorios que cuelgan del directorio actual
tree muestra el contenido del árbol de archivos
lsof <foo> enumera los procesos que tienen abierto el archivo "<foo>"
lsof -p <pid> enumera los archivos abiertos por el proceso con identificador:"<pid>"
mkdir <foo> crear un nuevo directorio "<foo>" en el directorio actual
rmdir <foo> elimina el directorio "<foo>" en el directorio actual
cd <foo> cambia de directorio al directorio "<foo>" en el directorio actual o en el directorio incluido en la variable "$CDPATH"
cd / cambia el directorio al directorio raíz
cd cambia el directorio al directorio principal del usuario actual
cd /<foo> cambia el directorio al directorio con ruta absoluta "<foo>"
cd .. cambia el directorio al directorio padre
cd ~<foo> cambia el directorio al directorio principal del usuario "<foo>"
cd - cambia el directorio al directorio anterior
</etc/motd pager muestra el contenido de "/etc/motd" usando el paginador por defecto
touch <junkfile> crea un archivo vacio "<junkfile>"
cp <foo> <bar> copia el archivo existente "<foo>" a un archivo nuevo "<bar>"
rm <junkfile> elimina el archivo "<junkfile>"
mv <foo> <bar> renombre el archivo existente "<foo>" con el nuevo nombre "<bar>" ("<bar>" no debe existir con anterioridad)
mv <foo> <bar> mueve el archivo existente "<foo>" a una nueva ubicación "<bar>/<foo>" (el directorio "<bar>" debe existir previamente)
mv <foo> <bar>/<baz> mueve un archivo existente "<foo>" a una nueva ubicación con el nuevo nombre "<bar>/<baz>" (el directorio "<bar>" debe existir con anteriorida pero el directorio "<bar>/<baz>" no)
chmod 600 <foo> hace que sobre un archivo que existe previamente "<foo>" no se le permita la lectura y la escritura a otras personas( y no se permite la ejecución a nadie)
chmod 644 <foo> hace que un archivo existente "<foo>" tenga permisos de lectura pero no de escritura por otros (y no ejecutable para todos)
chmod 755 <foo> hace que un archivo "<foo>" tenga permisos de lectura pero no de escritura por otros (y ejecutable por todos)
find . -name <expresión_regular> encuentra archivos que cumplen la "<expresión_regular>" usando el intérprete de órdenes (de manera lenta)
locate -d . <expresión_regular> encuentra archivos que cumplen "<expresión_regular>" usando el intérprete de órdenes (rápidamente usando la base de datos generada de forma periódica)
grep -e "<expresión regular>" *.html encuentra la "<expresión_regular>" en los archivos que terminan con ".html" en el directorio actual y los muestra todos
top muestra información de los procesos usando toda la pantalla, pulse "q" para terminar
ps aux | pager muestra información de todos los procesos ejecutándose usando la salida al estilo BSD
ps -ef | pager muestra información de todo s los procesos ejecutándose usando para la salida el estilo Unix system-V
ps aux | grep -e "[e]xim4*" muestra todos los procesos en ejecución "exim" y "exim4"
ps axf | pager muestra información de todos los procesos ejecutandose con la salida al estilo de arte ASCII
kill <1234> elimina el proceso identificado por el identificador de proceso: "<1234>"
gzip <foo> comprime "<foo>" y crea "<foo>.gz" usando la codificación Lempel-Ziv (LZ77)
gunzip <foo>.gz descomprime "<foo>.gz" y crea "<foo>"
bzip2 <foo> comprime "<foo>" y crea "<foo>.bz2" usando el algoritmo de compresión de texto por ordenación de bloques Burrows-Wheeler, y codificación Huffman (ofrece mejor compresión que gzip)
bunzip2 <foo>.bz2 descomprime "<foo>.bz2" y crea "<foo>"
xz <foo> comprime "<foo>" y crea "<foo>.xz" usando el algoritmo Lempel–Ziv–cadenas de Markov (ofrece mejor compresión quebzip2)
unxz <foo>.xz descomprime "<foo>.xz" y crea "<foo>"
tar -xvf <foo>.tar extrae archivos del archivo "<foo>.tar"
tar -xvzf <foo>.tar.gz extrae los archivos del archivo comprimido mediante gzip "<foo>.tar.gz"
tar -xvjf <foo>.tar.bz2 extrae archivos del archivo "<foo>.tar.bz2"
tar -xvJf <foo>.tar.xz extrae los archivos del archivo "<foo>.tar.xz"
tar -cvf <foo>.tar <bar>/ almacena el contenido de la carpeta "<bar>/" en el archivo "<foo>.tar"
tar -cvzf <foo>.tar.gz <bar>/ almacena el contenido de la carpeta "<bar>/" en el archivo comprimido "<foo>.tar.gz"
tar -cvjf <foo>.tar.bz2 <bar>/ almacena el contenido de la carpeta "<bar>/" en el archivo "<foo>.tar.bz2"
tar -cvJf <foo>.tar.xz <bar>/ almacena el contenido de la carpeta "<bar>/" en el archivo "<foo>.tar.xz"
zcat README.gz | pager muestra el contenido del archivo comprimido "README.gz" usando el paginador por defecto
zcat README.gz > foo crea un archivo "foo" con el contenido descomprimido de "README.gz"
zcat README.gz >> foo adjunta el contenido descomprimido de "README.gz" al final del archivo "foo" (si no existe, lo creará primero)

[Nota] Nota

Unix tiene una tradición de ocultar los archivos que comienzan con ".". Tradicionalmente contienen información de configuración y de preferencias de usuario.

[Nota] Nota

Para la órden cd, veabuiltins(7).

[Nota] Nota

El paginador por defecto del sistema Debian básico esmore(1) que no permite el desplazamiento para atrás. Instalando el paquete less usando la órden "apt-get install less", less(1) se convertirá en el paginador por defecto y que permite el desplazamiento hacia atrás con las teclas de cursor.

[Nota] Nota

"[" y"]" en la expresión regular de la órden "ps aux | grep -e "[e]xim4*"" habilita que grep no encaje consigo mismo. La expresiń regular "4*" signidica cero o más repeticiones del carácter "4" y de este modo permite a grep encajar con ambas expresiones "exim" y "exim4". Aunque "*" es usado en el intérprete de órdenes en el completado de nombres y en las expresiones regulares, sus significados son distintos. Aprenda expresiones regulares de grep(1).

Por favor, recorra los directorios y de un vistazo al sistema usando las órdenes que acaba de ver como entrenamiento. Si tiene dudas sobre cualquier órden de consola, por favor asegurese de leer la página del manual.

Por ejemplo, intente lo siguiente

$ man man
$ man bash
$ man builtins
$ man grep
$ man ls

El estilo de la páginas man puede ser un poco aspero cuando se usa, ya que puede ser bantante conciso, especialmente las más antiguas y más tradicionales. Pero una vez que se acostumbre, llegará a apreciar su concisión.

Por favor, tenga en cuenta que muchas órdenes de la familia Unix, incluidas las que vienen de GNU y BSD muestran un resumen de la ayuda si las ejecuta en alguna de las siguientes maneras (o sin parámetros en algunos casos).

$ <nombre_de_la_órden> --help
$ <nombre_de_la_órden> -h

Ahora ya tiene una muestra de como usar un sistema Debian. Veamos en profundidad el mecanismo de la ejecución de órdenes en el sistema Debian. En este tema haremos una simplificación de la realidad para las personas con poca experiencia. Veabash(1) para una explicación completa.

Una órden básica es una secuencia de componentes.

  1. Nombramiento de variables (opcional)

  2. Nombre de la órden

  3. Parámetros (opcional)

  4. Redirecciones (optional: > , >> , < , << , etc.)

  5. Operadores de control (optional: && , || , <newline> , ; , & , ( , ) )

El valor de algunas variables de entorno cambia el comportamiento de algunas órdenes Unix.

Los valores por defecto de las variables del entonro son iniciados por el sistema PAM y algunas de ellas son reajustadas por los programas de aplicación.

  • Los gestores de inicio de sesión como gdm3 inicializn las variables de entorno.

  • El intérprete de órdenes inicializa las variables de entorno por medio de "~/.bash_profile" y "~/.bashrc".

El valor final de la variable de la configuración regional "$LANG" consiste en tres partes: "xx_YY.ZZZZ".


Para códigos de lenguaje y códigos de países, vea la descripción pertinente en "info gettext".

Para la codificación en un sistema moderno Debian, usted debería asignar siempre UTF-8 a menos que especificamente quiera usar uno antiguo por una buena razón o mejorar su conocimiento.

Para los pequeños detalles de la configuración regional, consulte Sección 8.3, “Configuración regional”.

[Nota] Nota

"LANG=en_US" no es "LANG=C" ni "LANG=en_US.UTF-8". Es "LANG=en_US.ISO-8859-1" (vea Sección 8.3.1, “Fundamentos de codificación”).


La forma más normal de ejecutar la órden en un intérprete de órdenes es:

$ date
Sun Jun  3 10:27:39 JST 2007
$ LANG=fr_FR.UTF-8 date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Aquí, el programa date(1) se ejecuta con diferentes valores de la variable de entorno "$LANG".

La mayor parte de las ejecuciones de órdenes no suelen ir precedidos de definición de variables de entorno. Para el ejemplo anterior, otra forma alternativa es la siguiente:

$ LANG=fr_FR.UTF-8
$ date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Como se puede ver, la salida de la órden está determinada por la variable de entorno que muestra la salida en francés. Si se quiere que la variable se herede por los subprocesos (p. ej. cuando se ejecuta un archivo de órdenes), necesita usar export como sigue:

$ export LANG
[Nota] Nota

Cuando usa la típica terminal de consola, la variable de entorno "$LANG" es asignada para ser exportada por el entorno de escritorio. El ejemplo anterior no es en verdad un buen ejemplo para comprobar el efecto de export.

[Sugerencia] Sugerencia

Cuando complementa un informe de error, es una buena idea si no usa un entorno en inglés, ejecutar y comprobar las órdenes con "LANG=en_US.UTF-8".

Consulte locale(5) y locale(7) para "$LANG" y las variables de entorno relacionadas.

[Nota] Nota

Mi recomendación es que configure el entorno del sistema unicamente mediante la variable "$LANG" y evitar la variables "$LC_*" al menos que sea absolutamente necesario.

A menudo querrá que una órden afecte a un grupo de archivos sin escribir el nombre de cada uno de ellos. La expansión de patrónes de nombres de archivos usada por el intérprete de órdenes glob, (algunas veces también llamado uso de comodines), cubre esta necesidad.


Por ejemplo, intente lo siguiente

$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
$ echo *.txt
1.txt 2.txt
$ echo *
1.txt 2.txt 3.c 4.h
$ echo *.[hc]
3.c 4.h
$ echo .*
. .. .5.txt ..6.txt
$ echo .*[^.]*
.5.txt ..6.txt
$ echo [^1-3]*
4.h
$ cd ..; rm -rf junk

Glob glob(7).

[Nota] Nota

No como la expansión de nombres de archivos normales por parte del intérprete de órdenes "" probado en find(1) con "-name" test etc., encaja con el "." inicial del nombre de archivo. (Funcionalidad nueva de POSIX)

[Nota] Nota

BASH puede cambiar su comportamiento en la expansión de nombres de archivo con las opciones de su lenguaje interno como "dotglob", "noglob", "nocaseglob", "nullglob", " 9extglob 0", etc. Consulte bash(1).

Intentemos recordar los siguientes giros de las órdenes del intérprete de órdenes escritos en una línea como parde de la órden.

Tabla 1.22. Giro de la órden del intérprete de órdenes

Giro de la órden descripción
órden & ejecución en segundo plano de la órden en un intérprete de órdenes hijo
órden1 | órden2 entuba la salida estándar de órden1 a la entrada estándar deórden2 (se ejecutan de forma concurrente )
órden1 2>&1 | orden2 entuba tanto la salida estándar como el error estándar de la órden1 a la entrada estándar de la órden2 (se ejecutan de forma concurrente )
órden1 ; órden2 ejecuta la órden1 y la órden2 de forma secuencial
órden1 && órden2 ejecuta la órden1; si ha tenido éxito, ejecuta la órden2 secuencialmente (devuelve éxito si tantoórden1 como órden2 finalizan con éxito)
órden1 || órden2 ejecuta la órden1; si no tiene éxito, se ejecuta la órden2 de forma secuencial (devuelve éxito si órden1 o órden2 se ejecutan con éxito)
órden > foo redirecciona la salida estándar de la órden al archivo foo (sobreescribiendolo si existe)
órden 2> foo redirecciona el error estándar de órden al archivo foo (sobreescribiendolo)
órden >> foo redirecciona la salida estándar de órden al archivofoo (añadiendlola)
órden 2>> foo redirecciona el error estándar de órden al archivo foo (añadiendola)
órden > foo 2>&1 redirecciona tanto la salida estándar como el error estándar deórden a un archivofoo
órden < foo redirecciona la entrada estándar de órden al archivo foo
órden << delimitador redirecciona la entrada estándar de órden a las líneas siguientes hasta que encuentra"delimitador" (Aquí documento)
órden <<- delimitador redirect standard input of command to the following lines until "delimiter" is met (here document, the leading tab characters are stripped from input lines)

El sistema Debian es un sistema multitarea. Los trabajos en segundo plano permiten a los usuarios ejecutar múltiples programas desde un único intérprete de órdenes. La gestión de los procesos en segundo plano incluye sus órdenes internas: jobs, fg, bg, and kill. Por favor, lea las secciones de bash(1) tituladas "SIGNALS", and "JOB CONTROL", y builtins(1).

Por ejemplo, intente lo siguiente

$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager

Aunque los cuatro ejemplos de redirección del intérprete de órdenes muestran la misma cosa, el último ejemplo ejecuta una órden más cat y desperdicia recursos sin razón alguna.

El intérprete de órdenes permite abrir archivos usando la órden internaexec con un descriptor de archivo arbitrario.

$ echo Hello >foo
$ exec 3<foo 4>bar  # open files
$ cat <&3 >&4       # redirect stdin to 3, stdout to 4
$ exec 3<&- 4>&-    # close files
$ cat bar
Hello

Los descriptores de archivo de 0 a 2 están predefinidos.


En un entorno de trabajo del estilo de Unix, el procesamiento de texto se realiza por medio del "entubamiento" de el texto a través de una cadena de herramientas de prcocesamiento de texto. Esta fue otra de las innovaciones esenciales de Unix.

Existen algunas herramientas para el procesamiento de texto que son usadas de forma muy frecuente por un sistema tipo Unix.

Si no esta seguro de que hacen exactamente estas órdenes, por favor use "man órden" para solucionarlo por usted mismo.

[Nota] Nota

El criterio de ordenación y alcance de las expresiones son dependientes de la configuración regional. Si desea obtener el comportamiento tradicional de una órden, use la configuración regional C en lugar de UTF-8 anteponiendo la órden "LANG=C" (consulte Sección 1.5.2, “La variable "$LANG"” y Sección 8.3, “Configuración regional”).

[Nota] Nota

Las expresiones regulars de Perl(perlre(1)), Perl Compatible Regular Expressions (PCRE), y las expresiones regulares de Python ofrecidas por su módulo re tienen muchas expresiones comunes a las traducionales ERE.

Las expresiones regulares Regular expressions son usadas por muchas herramientas de procesamiento de texto. Son similares a la expansión de nombres de archivo el en intérprete de órdenes, aunque más complicadas y poderosas.

Las expresiones regulares especifican un patrón de encaje y está compuesto por carácteres de texto y metacaracteres.

Un metacaracter es solamente un carácter que tiene un significado especial. Existen dos tendencias principales, BRE y ERE, dependiendo de las herramientas de texto como describiremos más adelante.


Emacs usa principalmente el tipo de expresión regular BRE pero ha sido ampliada para utilizar "+" y "?" como metacaracteres como en ERE. De este modo, no es necesario "escaparlas" con "\" en las expresiones regulares en emacs.

grep(1) puede usarse para realizar la búsqueda de texto por medio de expresiones regulares.

Por ejemplo, intente lo siguiente

$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
Yoyodyne, Inc., hereby disclaims all copyright interest in the program

En la sustitución de expresiones, algunos caracteres tiene un significado especial.


En Perl Perl la cadena de sustitución, "$n" es usada en lugar de "\n" y "&" no tiene un significado especial.

Por ejemplo, intente lo siguiente

$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
zzz=1abc2efg3hij4=
$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
zzz=&=

Hay que prestar atención especial a como las expresiones regulares entre corchetes o paréntesis encajan con las cadenas de caracteres en el proceso de sustitución de texto en cada una de las diferentes herramientas.

También se pueden usar estas expresiones regulares para desplazarse por el texto y realizar acciones de sustitución en algunos editores.

La barra invertida "\" al final de la línea en el intérprete de órdenes sustituye el carácter de nueva línea por un carácter de espacio en blanco y permite continuar la misma órden en la siguiente línea.

Por favor, lea todas las páginas de "man" relacionadas con estas órdenes.

La órden ed(1) permite sustituir todas las ocurrencias de "LA_EXPRESIÓN_REGULAR" por "EL_TEXTO" en el "archivo".

$ ed file <<EOF
,s/FROM_REGEX/TO_TEXT/g
w
q
EOF

La órden sed(1) sustituye todas las ocurrencias de "LA_EXPRESIÓN_REGULAR" con "EL_TEXTO" en el "archivo".

$ sed -i -e 's/LA_EXPRESIÓN_REGULAR/EL_TEXTO/g' archivo

La órden vim(1) puede sustituir todas las ocurrencias de "LA_EXPRESIÓN_REGULAR" por "EL_TEXTO" en el "archivo" usando las órdenes ex(1).

$ vim '+%s/LA_EXPRESIÓN_REGULAR/EL_TEXTO/gc' '+w' '+q' archivo
[Sugerencia] Sugerencia

La bandera "c" en la órden anterior hace que se pida la confirmación interactiva de cada sustitución.

Múltiples archivos ("archivo1", "archivo2", y "archivo3") pueden ser procesados por las expresiones regulares de manera similar con vim(1) o perl(1).

$ vim '+argdo %s/LA_EXPRESIÓN_REGULAR/EL_TEXTO/ge|update' '+q' archivo1 archivo2 archivo3
[Sugerencia] Sugerencia

La bandera "e" anterior evita el error de "no encaje" error rompiendo un mapeo.

$ perl -i -p -e 's/LA_EXPRESIÓN_REGULAR/EL_TEXTO/g;' archivo1 archivo2 archivo3

En el ejemplo en perl(1), "-i" es para la edición local de cada uno de los archivos objetivos, y "-p" se usa para el bucle implícito sobre todos los archivos dados.

[Sugerencia] Sugerencia

El uso del parámetro "-i.bak" en vez de "-i" mantiene cada archivo original añadiendo ".bak" al nombre del archivo. Esto permite una recuperación más fácil en el caso de errores en sustituciones complejas.

[Nota] Nota

ed(1) y vim(1) usan BRE; perl(1) usa ERE.

Consideremos un archivo de texto llamado "DPL" donde están los algunos nombres de los líderes del proyecto Debian anteriores a 2004 y su fecha de inicio en una lista de campos con el espacio como separador.

Ian     Murdock   August  1993
Bruce   Perens    April   1996
Ian     Jackson   January 1998
Wichert Akkerman  January 1999
Ben     Collins   April   2001
Bdale   Garbee    April   2002
Martin  Michlmayr March   2003
[Sugerencia] Sugerencia

Vea "Historia breve de Debian" para el último lider del proyecto Debian.

Awk es usado a menudo para obtener datos de este tipo de archivos.

Por ejemplo, intente lo siguiente

$ awk '{ print $3 }' <DPL                   # mes de comienzo
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL          # DPL llamado Ian
Ian     Murdock   August  1993
Ian     Jackson   January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # Cuando Perens empezó
April 1996

Intérprete de órdenes, como Bash, puede ser usado para analizar este tipo de archivos.

Por ejemplo, intente lo siguiente

$ while read first last month year; do
    echo $month
  done <DPL
... la misma salida que el primer ejemplo de Awk

Aquí, la órden interna read usa los carácteres de "$IFS" (campo separador interno) para dividir las líneas en palabras.

Si asigna el valor ":" a "$IFS", se puede analizar "/etc/passwd" con el intérprete de órdenes de la forma adecuada.

$ oldIFS="$IFS"   # guarda el valor antiguo
$ IFS=':'
$ while read user password uid gid rest_of_line; do
    if [ "$user" = "bozo" ]; then
      echo "$user's ID is $uid"
    fi
  done < /etc/passwd
bozo's ID is 1000
$ IFS="$oldIFS"   # restaura el valor antiguo

(Si se usa Awk para hacer lo mismo, use "FS=':'" para asignar el separador de campos.)

IFS is also used by the shell to split results of parameter expansion, command substitution, and arithmetic expansion. These do not occur within double or single quoted words. The default value of IFS is <space>, <tab>, and <newline> combined.

Tenga cuidado al usar estos trucos con el intérprete de órdenes. Cuando el intérprete de órdenes interprete algunas partes del archivo de órdenes y su entrada pueden ocurrir cosas extrañas.

$ IFS=":,"                        # usa ":" y "," como IFS
$ echo IFS=$IFS,   IFS="$IFS"     # muestra si es una función interna
IFS=  , IFS=:,
$ date -R                         # salida de la órden
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R)                 # subintérprete de órdenes --> entrada al principal
Sat  23 Aug 2003 08 30 36 +0200
$ unset IFS                       # inicia IFS al valor por defecto
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200

Los siguientes archivos de órdenes hacen grandes cosas como parte de una tubería.

Tabla 1.26. Lista de fragmentos de archivos de órdenes para órdenes entubadas

fragmento de archivo de órdenes (escrito en una única línea) efecto de la órden
find /usr -print enumera todos los archivos que se encuentran por debajo de "/usr"
seq 1 100 escribe del 1 al 100
| xargs -n 1 <órden> ejecuta la órden de forma repetida para cada elemento de la tubería teniedo a este como parámetro
| xargs -n 1 echo divide los elementos separados por espacios en blanco de la tubería en líneas
| xargs echo mezcla todas la líneas de la tubería en una
| grep -e <patrón_de_expresión_regular> extrae las líneas de la tubería que contienen <patrón_de_expresión_regular>
| grep -v -e <patrón_de_expresión_regular> extrae las líneas de la tubería que no contienen el <patrón_de_la_expresión_regular>
| cut -d: -f3 - extrae el tercer campo de la tubería separado por ":" (archivo de contraseñas etc.)
| awk '{ print $3 }' extrae el tercer campo de la tubería separado por espacios en blanco
| awk -F'\t' '{ print $3 }' extrae el tercer campo de la tubería separando por tabuladores
| col -bx elimina los retornos de carro y expande los tabuladores a espacios
| expand - expande los tabuladores
| sort| uniq ordena y elimina duplicados
| tr 'A-Z' 'a-z' convierte mayúsculas en minúsculas
| tr -d '\n' concatena líneas en una
| tr -d '\r' elimina el retorno de carro
| sed 's/^/# /' añade "#" al comienzo de cada línea
| sed 's/\.ext//g' elimina ".ext"
| sed -n -e 2p imprime la segunda línea
| head -n 2 - imprimer las primeras dos líneas
| tail -n 2 - imprime las últimas dos líneas

Un archivo de órdenes puede repetirse sobre varios archivos usando find(1) yxargs(1) realizando tareas bastante complicadas. Consulte Sección 10.1.5, “Formas de selección de archivos” and Sección 9.3.9, “Repetición de una órden sobre archivos”.

Cuando usar órdenes de forma interactiva se complica demasiado, debe considerar escribir un archivos de órdenes (consulte Sección 12.1, “Los archivos de órdenes”).