Capítulo 1. Tutoriales de GNU/Linux

# Capítulo 1. Tutoriales de GNU/Linux

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. Para ayudarle a comenzar sin tropiezos, he escrito algunos puntos básicos.

La calidad del diseño de Debian GNU/Linux tiene su origen en el 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 utilice únicamente documentos de GNU/Linux y utilice también documentos de Unix , ya que esto le permitirá acceder a mucha información útil.

| Nota
Si tiene experiencia con las herramientas de la línea de órdenes de algún sistema tipo Unix probablemente ya conozca lo que se explica en este documento. Utilice este documento para refrescar sus conocimientos.

## 1.1. Introducción a la consola

### 1.1.1. El cursor del intérprete de órdenes

Al iniciar el sistema, aparecerá la pantalla de inicio de sesión basada en caracteres si no instaló ningún entorno GUI de sistema de escritorio como GNOME o KDE. Supongamos que su nombre de host es `foo`, el indicador de inicio de sesión tiene el siguiente aspecto.

A pesar de tener instalado un entorno gráfico de usuario, puede acceder al indicador de inicio de sesión basado en caracteres mediante Ctrl-Alt-F3, y puede regresar al entorno GUI mediante Ctrl-Alt-F2 (consulte Sección 1.1.6, “Consolas virtuales” para más información).

    foo login:

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
Siguiendo la tradición Unix, el nombre de usuario y la contraseña del sistema Debian distinguen entre mayúsculas y minúsculas. El nombre de usuario se suele elegir sólo entre minúsculas. La primera cuenta de usuario se crea normalmente durante la instalación. El usuario root puede crear cuentas de usuario adicionales con 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 12 foo tty3

    foo login: penguin
    Password:

    Linux foo 6.5.0-0.deb12.4-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.5.10-1~bpo12+1 (2023-11-23) 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.

    Last login: Wed Dec 20 09:39:00 JST 2023 on tty3
    foo:~$

Ahora nos encontramos en el intérprete de órdenes (shell). El intérprete de órdenes interpreta las órdenes del usuario.

### 1.1.2. El indicador del intérprete de órdenes en GUI

Si ha instalado un entorno GUI durante la instalación, se mostrará una pantalla gráfica de inicio de sesión al iniciar el sistema. Escribe el nombre de usuario y la contraseña para iniciar sesión en la cuenta de usuario sin privilegios. Use la pestaña para navegar entre el nombre de usuario y la contraseña, o use el clic principal del ratón.

Puede obtener un cursor del intérprete de órdenes en un entorno 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«.

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ú.

### 1.1.3. La cuenta de superusuario (`root`)

La cuenta root también se denomina superusuario o usuario privilegiado. Desde esta cuenta, puede realizar las siguientes tareas de administración del sistema.

- 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 no privilegiado 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
Nunca comparta la contraseña del superusuario con nadie.

| 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 situaciones, resolverlas es algo que debe hacerse estableciendo adecuadamente los permisos del archivo y la relación de usuarios que pertenece a cada grupo (véase Sección 1.2.3, “Permisos del sistema de archivos”).

### 1.1.4. El cursor del intérprete de órdenes de superusuario

A continuación podrá ver algunos métodos para acceder al intérprete de órdenes del superusuario utilizando la contraseña del mismo.

- Escriba `root` en la pantalla de inicio de sesión en modo texto.

- Escriba «`su -l`» desde cualquier intérprete de órdenes.

  - Esto no conserva el entorno del usuario actual.

- Escriba «`su`» en cualquier intérprete de órdenes.

  - esto conserva parte del entorno del usuario actual.

### 1.1.5. Herramientas gráficas para la administración del sistema

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 en un emulador de terminal de X como gnome-terminal(1), rxvt(1), o xterm(1). Ver Sección 1.1.4, “El cursor del intérprete de órdenes de superusuario” y Sección 7.9, “conexión del servidor X”.

| Aviso
Nunca inicies un administrador de pantalla/sesión de GUI como root escribiendo `root` en el indicador de un administrador de pantalla (por ejemplo, gdm3(1)). 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 interceptación pasiva de toda su pantalla X.

### 1.1.6. Consolas virtuales

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 `F1` — `F6`. 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 está en un entorno GUI puede ir a la consola de caracteres 3 con la tecla `Ctrl-Alt-F3`, es decir, presionando al mismo tiempo `Left Ctrl` y `Left Alt` y `tecla F3`. Puede presionar `Alt-F2` para volver al entorno de GUI, que generalmente se ejecuta en la consola virtual 2.

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

    # chvt 3

### 1.1.7. Cómo cerrar el intérprete de órdenes

Pulsando `Ctrl-D`, es decir, la tecla `Ctrl de la izquierda` y la tecla `d` simultáneamente en el intérprete de órdenes, se cerrará. Si se encuentra en una consola de modo texto, volverá a ver la pantalla de inicio de sesión. Aunque es normal referirse a estos caracteres de control como «control D» en mayúscula, no es necesario pulsar la tecla de mayúsculas. La abreviatura `^D` también es muy utilizada para `Ctrl-D`. Otra forma de cerrar el intérprete de órdenes es escribiendo «exit».

Si está en `x-terminal-emulator` (1), puede cerrar la ventana `x-terminal-emulator` con esto.

### 1.1.8. Cómo apagar el sistema

Al igual que cualquier otro sistema operativo moderno en el que la operación con ficheros implica almacenamiento de datos en memoria para mejorar el rendimiento, el sistema Debian necesita el procedimiento de apagado adecuado antes de poder apagarse de forma segura. Esto es para mantener la integridad de los ficheros, forzando que todos los cambios en memoria se escriban en el disco. Si el software de control de energía está disponible, el procedimiento de apagado apaga automáticamente el sistema. (De lo contrario, es posible que tenga que pulsar el botón de encendido durante unos segundos después del procedimiento de apagado)

Puedes apagar el sistema en modo multiusuario normal desde la línea de comandos.

    # shutdown -h now

Puede apagar el sistema en el modo monousuario desde el intérprete de órdenes como se muestra.

    # poweroff -i -f

Ver Sección 6.3.8, “Apagar un sistema remoto con SSH”.

### 1.1.9. Cómo recuperar la configuración normal de una consola

Cuando la pantalla se vuelve loca tras hacer alguna cosa divertida como «`cat un-archivo-binario`», escriba «`reset`» en el intérprete de órdenes. Puede que no sea posible ver la orden en la pantalla mientras la teclea. Además, puede escribir «`clear`» para limpiar la pantalla.

### 1.1.10. Paquetes complementarios recomendados para usuarios sin experiencia

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 orden apt-get(8) para que los nuevos usuarios empiecen a tener experiencia con lo siguiente.

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

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

Tabla 1.1. Relación de paquetes con programas interesantes en modo texto

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`mc` | V:41, I:182 | 1590 | Un gestor de archivos en modo texto a pantalla completa
`sudo` | V:750, I:866 | 6774 | Un programa para dar algunos privilegios de superusuario a los usuarios de acuerdo a la configuración establecida
`vim` | V:85, I:347 | 4135 | Editor de texto Unix Vi IMproved (Vi Mejorado), un editor de texto para programadores (versión estándar)
`vim-tiny` | V:57, I:979 | 1862 | Editor de texto Unix Vi IMproved (Vi Mejorado), un editor de texto para programadores (versión compacta)
`emacs-nox` | V:3, I:13 | 46564 | El proyecto GNU Emacs, un editor de texto ampliable basado en Lisp
`w3m` | V:11, I:137 | 2853 | Navegadores web en modo texto
`gpm` | V:8.7, I:9.5 | 524 | Copiar y pegar, al estilo Unix, en la consola de texto (demonio)

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

Tabla 1.2. Relación de paquetes con documentación útil

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`doc-debian` | I:883 | 185 | Documentación del Proyecto Debian, Preguntas Frecuentes (FAQ) y otros documentos
`debian-policy` | I:7.4 | 5147 | Manual de la Directrices Debian y documentos asociados
`developers-reference` | V:0.2, I:2.4 | 2635 | Directrices e información para desarrolladores de Debian
`debmake-doc` | I:0.37 | 11807 | Guía para Mantenedores de Debian
`debian-history` | I:0.52 | 6251 | Historia del Proyecto Debian
`debian-faq` | I:881 | 791 | Preguntas frecuentes (FAQ) sobre Debian

Puedes instalar algunos de estos paquetes de la siguiente manera.

    # apt-get install package_name

### 1.1.11. Una cuenta de usuario adicional

Si no quiere utilizar su cuenta de usuario aprende y práctica, puede crear una cuenta de usuario, p. ej. `pescado`, para ello haga lo siguiente.

    # adduser fish

Conteste a todas las preguntas.

Con ello se creará una nueva cuenta llamada `pescado`. Cuando termine de practicar, puede borrar esta cuenta y su directorio de usuario como se muestra.

    # deluser --remove-home fish

En sistemas Debian especializados y no Debian, las actividades anteriores deben utilizar niveles inferiores `useradd` (8) y `userdel` (8) utilidades, en su lugar.

### 1.1.12. Configuración de sudo

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 "penguin  ALL=(ALL) ALL" >> /etc/sudoers

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

    # echo "penguin  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
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

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

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

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

Con una configuración mejor pensada y cuidadosa, sudo(8) puede dar 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 equipo 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.

### 1.1.13. Hora de jugar

Ahora está listo para jugar con el sistema Debian sin riesgos siempre que utilice la cuenta de usuario sin privilegios.

Esto se debe a que el sistema Debian está, incluso en una instalación por defecto, configurado con los permisos de archivos adecuados que impide que los usuarios no privilegiados dañen el sistema. Por supuesto, puede haber aún algunos agujeros que se pudieran explotar, pero aquellos a quienes interesen esos detalles, que no trataremos aquí, pueden obtener la información precisa en Manual de seguridad de Debian.

Aprendemos el sistema Debian como un sistema Unix-like con lo siguiente.

- Sección 1.2, “Sistema de archivos tipo Unix” (conceptos básicos),

- Sección 1.3, “Midnight Commander (MC)” (método de supervivencia),

- Sección 1.4, “Fundamentos de entornos de trabajo tipo Unix” (método básico),

- Sección 1.5, “Órdenes simples para el intérprete de órdenes” (mecanismos del intérprete de órdenes (shell)),

- Sección 1.6, “Operaciones de texto al estilo de Unix” (método de procesado de texto)

## 1.2. Sistema de archivos tipo Unix

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 «`/usr/share/doc/linux-doc-*/Documentation/filesystems/`».

Los directorios de los sistemas Unix se llaman 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.

### 1.2.1. Información básica sobre archivos en Unix

Estos son algunos conceptos básicos de los archivos Unix.

- Los nombres de archivos son sensibles a mayúsculas. Es decir, «`MIARCHIVO`» y «`MiArchivo`» son archivos diferentes.

- El directorio raíz (root en inglés) se llama así por estar en la raíz del sistema de archivos representado simplemente por «`/`». No lo confunda con el directorio del superusuario: «`/root`».

- Cada directorio tiene un nombre que puede contener cualquier letra o símbolo excepto «`/`». El directorio raíz es una excepción: su nombre es «`/`» (pronunciado «barra« o «el directorio raíz«) y no se puede renombrar.

- Cada archivo o directorio se identifi con un nombre completamente cualificado, nombre absoluto, o ruta), dando la secuencia de directorios que deben atravesarse para alcanzarlo. Los tres términos son sinónimos.

- Todos los nombres completamente cualificados comienzan con el directorio «`/`», y se coloca una «`/`» entre cada dos nombres de directorio o archivo en el nombre de fichero completo. La primera «`/`» es el directorio de más alto nivel (la raíz) y las demás «`/`» separan subdirectorios sucesivos hasta que alcanzamos la última entrada, que es el nombre real del archivo en cuestión. Las palabras pueden ser confusas. Elijamos el siguiente nombre completamente cualificado como un ejemplo: «`/usr/share/keytables/es.map.gz`». Es de uso generalizado el referirse a la última entrada «`es.map.gz`» como un nombre de archivo.

- El directorio raíz tiene un cierto número de ramificaciones, como «`/etc/`» y «`/usr/`». Estos subdirectorios a su vez se ramifican en más subdirectorios, como «`/etc/systemd/`» y «`/usr/local/`». El todo, visto colectivamente, se llama árbol de directorios. Puede pensar que un nombre de archivo absoluto es una ruta desde la raíz del árbol («`/`») hasta la hoja de una rama (un archivo). También oirá hablar del árbol de directorios como de un árbol genealógico que descienden de un elemento único llamado raíz («`/`»: así, los subdirectorios tienen padres y una ruta muestra la genealogía completa de un archivo. Hay, además, rutas relativas que comienzan de alguna otra manera que con el directorio raíz. Debe recordar que el directorio «`../`» hace referencia al directorio padre. Esta terminología se utiliza también para otras estructuras semejantes a los directorios, como las estructuras jerárquicas de datos.

- No existen directorios, que forman parte de las rutas que describen archivos, que se correspondan con dispositivos físicos, como discos duros. Esto cambia respecto a RT-11, CP/M, OpenVMS, MS-DOS, AmigaOS y Microsoft Windows, donde la ruta contiene el nombre del dispositivo, como «`C:\`». Sin embargo, existen directorios que referencian dispositivos físicos como parte del sistema de archivos. Ver Sección 1.2.2, “Sistemas de archivos internos”)

| Nota

Es posible usar casi cualquier letra o símbolo en el nombre de un archivo, pero es una mala idea. Es preferible evitar el uso de cualquier carácter que tenga un significado especial en la línea de órdenes, incluido espacios, tabulaciones, saltos de línea y otros caracteres especiales: `{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $`. Si quiere separar palabras en un nombre, son buenas elecciones el punto, el guión y el guión bajo. Además puede empezar cada palabra con mayúscula, «`ComoEsto`». Los usuarios con experiencia suelen evitar los espacios en los nombres de archivo.

| Nota
La palabra «root» puede referirse a «superusuario» o «directorio raíz». El contexto determinará su significado correcto.

| Nota
El término path se utiliza tanto para los nombres de archivos que especifican la ruta completa, como hemos hecho con anterioridad, como en la ruta para la búsqueda de órdenes. El significado correcto vendrá determinado por el contexto.

Las mejores prácticas detalladas para la jerarquía de ficheros se describen en el Filesystem Hierarchy Standard ("`/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz`" y hier(7)). Como comienzo debes recordar los siguientes hechos.

Tabla 1.3. Relación de directorios clave y su uso

directorio | uso del directorio
--- | ---
`/` | directorio raíz
`/etc/` | archivos principales para la configuración del sistema
`/var/log/` | archivos de registro del sistema
`/home/` | todos los directorios personales de usuario sin privilegios

### 1.2.2. Sistemas de archivos internos

Siguiendo la tradición de Unix, el sistema Debian GNU/Linux ofrece el sistemas de archivos «`/dev/`» que representa de manera unificada el almacenamiento físico en discos duros u otros dispositivos de almacenamiento y la interacción con los dispositivos hardware como las consolas en modo texto o las consolas en serie remotas.

Cada archivo, directorio, tubería con nombre (sirve para compartir datos entre dos programas) o dispositivo físico tiene en el sistema Debian GNU/Linux una estructura con metainformación llamada inodo que describe sus propiedades como quién es su dueño (owner), el grupo al que pertenece, la fecha de último acceso, etc. La idea de incluir todo en el sistema de archivos fue una innovación de Unix y las versiones modernas de los núcleos de Linux la han llevado más allá. Hoy en día puede encontrar en el sistema de archivos incluso información de procesos en ejecución.

La representación unificada y abstracta tanto de entidades físicas como de procesos internos es sumamente útil ya que permite el uso de la misma orden 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 enlazándolos a procesos en ejecución.

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

### 1.2.3. Permisos del sistema de archivos

Los permisos del sistema de archivos de Unix-like se definen en tres categorías de usuarios afectados.

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

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

- Todos los usuarios de other (o), también llamado "mundo" o "todo el mundo"

Para el fichero, cada permiso correspondiente 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 orden.

Para el directorio, cada permiso correspondiente permite las siguientes acciones.

- El permiso de lectura (r) permite al propietario listar el contenido del directorio.

- El permiso de escritura (w) permite al propietario añadir o eliminar archivos en el directorio.

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

El permiso de ejecución de un directorio no solo indica que se pueden leer los archivos que contiene, sino que también sus atributos, como el tamaño y la fecha de modificación.

ls(1) se utiliza para mostrar información de permisos (y más) para archivos y directorios. Cuando se invoca con la opción "`-l`", muestra la siguiente información en el orden indicado.

- tipo de fichero (primer carácter),

- permisos del archivo (nueve caracteres, tres para el usuario, 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

Tabla 1.4. La interpretación del primer carácter de cada línea de la salida de «`ls -l`» se interpreta como se muestra

carácter | significado
--- | ---
`-` | archivo normal
`d` | directorio
`l` | enlace simbólico
`c` | nodo de dispositivo orientado a caracteres
`b` | nodo de dispositivo orientado a bloques
`p` | tubería con nombre
`s` | socket

Para cambiar el dueño de un archivo, el superusuario utiliza la orden chown(1). Para alterar el grupo de un archivo, su dueño utiliza la orden chgrp(1). Para modificar los permisos del acceso al archivo o directorio, su dueño o el superusuario utilizan la orden chmod(1). La sintaxis para operar sobre un archivo `foo` es la que se muestra.

    # chown newowner foo
    # chgrp newgroup 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` como se muestra.

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

Existen tres bits adicionales de permisos especiales.

- El bit set user ID (s o S en lugar del permiso del dueño x)

- El bit set group ID (s o S en lugar del permiso del grupo x)

- El bit sticky (t o T en vez del permiso de todos x)

Aquí, la salida de "`ls -l`" para estos bits está en mayúscula si los bits de ejecución ocultos por estas salidas están sin configurar.

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 crea 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 la creación de archivos al estilo BSD, donde todos los archivos creados en el directorio pertenecen al mismo grupo que el directorio.

Activar el sticky bit en un directorio impide que sus archivos sean eliminados por alguien que no es su dueño. En los directorios con permisos de escritura para todos, como «`/tmp`», o para su grupo, con el fin de asegurar la integridad de los archivos, se debe eliminar los permisos de escritura de los archivos. Además se debe configurar el sticky bit en el directorio para evitar que cualquier usuario con permiso de escritura en él pueda borrar un archivo y después crear otro con el mismo nombre.

Aquí están 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 orden chmod(1) tiene otra forma de describir los permisos mediante números. Este modo numérico utiliza 3 o 4 dígitos en base octal (base 8).

Tabla 1.5. El modo numérico en chmod(1) es como se muestra

dígito | significado
--- | ---
1º dígito (opcional) | suma de set user ID (=4), set group ID (=2) y sticky bit (=1)
2º dígito | suma de los permisos de lectura (=4), escritura (=2) y ejecución (=1) para usuario
3º dígito | idem para el grupo
4º dígito | idem para todos

Parece más complicado de lo que es. Si se fija en las primeras columnas (de la 2 a la 10) de la salida de la orden «`ls -l`» y la lee como la representación en binario (base 2) de los permisos del archivo («-» siendo «0» y cualquiera de «rwx» un «1»), la conversión a octal (base 8) de los últimos 3 dígitos representaría 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
Si necesita acceder a información de salida de la orden «`ls -l`» en un archivo de órdenes, es mejor utilizar las órdenes como test(1), stat(1) y readlink(1). La funcionalidad interna del intérprete de órdenes como«`[`» o «`test`» se puede usar también.

### 1.2.4. Gestión de permisos para nuevos archivos: umask

Los permisos que se asignan por defecto a los nuevos archivos y directorios cuando estos se crean están definidos por la orden interna del intérprete de órdenes `umask`. Consulte dash(1), bash(1) y builtins(7).

     (file permissions) = (requested file permissions) & ~(umask value)

Tabla 1.6. Ejemplos de valores de umask

umask | permisos creados para un archivo | permisos creados para un directorio | uso
--- | --- | --- | ---
`0022` | `-rw-r--r--` | `-rwxr-xr-x` | modificable solo por el usuario
`0002` | `-rw-rw-r--` | `-rwxrwxr-x` | modificable por el grupo

El sistema Debian utiliza por defecto un esquema de grupos privados de usuarios (UPG). Un grupo privado de usuario se crea cuando sea añade un nuevo usuario al sistema. El UPG tiene el mismo nombre que el usuario para el cual fue creado y ese usuario es el único miembro de ese grupo. En el esquema UPG es seguro asignar a la máscara (umask) el valor `0002` ya que cada usuario tiene un grupo privado propio. (En algunas variantes de Unix, es común que todos los usuarios no privilegiados pertenezcan al mismo grupo `users` siendo buena idea asignar el valor `0022` a la máscara por motivos de seguridad.)

| Sugerencia
Active UPG añadiendo «`umask 002`» en el archivo `~/.bashrc`.

### 1.2.5. Permisos para grupos de usuarios (grupo)

| Aviso
Por favor, asegúrese de guardar los cambios no guardados antes de realizar reinicios o acciones similares.

Puedes añadir un usuario `penguin` a un grupo `bird` en dos pasos:

- Cambie la configuración del grupo utilizando una de las siguientes opciones:

  - Ejecute "`sudo usermod -aG bird penguin`".

  - Ejecute "`sudo adduser penguin bird`" (sólo en sistemas Debían típicos)

  - Ejecute "`sudo vigr`" para `/etc/group` y "`sudo vigr -s`" para `/etc/gshadow` para añadir `penguin` en la línea para `bird`.

- Aplique la configuración utilizando una de las siguientes opciones:

  - Reinicio e inicio de sesión. (Mejor opción)

  - Cerrar la sesión con el menú GUI y volver a entrar. (Puede no funcionar en el entorno de escritorio actual).

Puedes eliminar un usuario `penguin` de un grupo `bird` en dos pasos:

- Cambie la configuración del grupo utilizando una de las siguientes opciones:

  - Ejecute "`sudo usermod -rG bird penguin`".

  - Ejecute "`sudo deluser penguin bird`" (sólo en sistemas Debian típicos)

  - Ejecute "`sudo vigr`" para `/etc/group` y "`sudo vigr -s`" para `/etc/gshadow` para eliminar `penguin` en la línea para `bird`.

- Aplique la configuración utilizando una de las siguientes opciones:

  - Reinicio e inicio de sesión. (Mejor opción)

  - Ejecute "`kill -TERM -1`" y realice algunas acciones de reparación como "`systemctl restart NetworkManager.service`".

  - El cierre de sesión a través del menú GUI no es una opción para Gnome Desktop.

Cualquier intento de reinicio en caliente es un frágil sustituto del verdadero reinicio en frío en el sistema de escritorio moderno.

| Nota
Otra manera dinámica consiste en añadir usuarios a grupos durante el proceso de acreditación añadiendo la línea «`auth optional pam_group.so`» al archivo «`/etc/pam.d/common-auth`» y configurar «`/etc/security/group.conf`». (Consulte Capítulo 4, Autenticación y controles de acceso.)

Los dispositivos de hardware son también archivos en el sistema Debian. Si tiene problemas al acceder a dispositivos como el CD-ROM o dispositivos de memoria USB con una cuenta de usuario, debería añadir a este usuario al grupo pertinente.

Algunos grupos importantes del propio sistema permiten a sus miembros acceder a archivos y directorios específicos sin privilegios de `superusuario`.

Tabla 1.7. Relación de grupos importantes del sistema para el acceso a archivos

grupo | descripción de archivos y dispositivos accesibles
--- | ---
`dialout` | acceso directo y completo a los puertos serie («`/dev/ttyS[0-3]`»)
`dip` | acceso limitado a los puertos serie para establecer conexiones a internet por vía telefónica (dialup IP) a pares confiables
`cdrom` | dispositivos CD-ROM, DVD+/-RW
`audio` | dispositivo audio
`video` | dispositivo de vídeo
`scanner` | escáner
`adm` | registros de supervisión del sistema
`staff` | algunos directorios para la administración básica del sistema: «`/usr/local`», «`/home`»

| 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 por vía 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`.

Tabla 1.8. Relación de grupos importantes del sistema para la ejecución de órdenes específicas

grupo | órdenes permitidas
--- | ---
`sudo` | execute any command with superuser privileges
`lpadmin` | ejecuta órdenes para añadir, modificar y eliminar las impresoras disponibles

Puede consultar una relación completa de los usuarios y grupos del sistema en el documento «Users and Groups« `/usr/share/doc/base-passwd/users-and-groups.html` del paquete `base-passwd`.

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

### 1.2.6. Marcas de tiempo

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

Tabla 1.9. Relación de tipos de marcas de tiempo

tipo | significado (definición histórica en Unix)
--- | ---
mtime | el momento de modificación (`ls -l`)
ctime | el momento de cambio de estado (`ls -lc`)
atime | el momento del último acceso (`ls -lu`)

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

| Nota
El significado actual de atime en sistemas GNU/Linux puede no ser diferente del de Unix clásico.

- Al sobrescribir un archivo se cambian todos los atributos mtime, ctime y atime del archivo.

- Cambiar la propiedad o el permiso de un archivo modifica los atributos ctime y atime del archivo.

- la lectura de un archivo en un sistema Unix clásico modifica su propiedad atime.

- La lectura de un archivo cambia el atributo atime del archivo en el sistema GNU/Linux si su sistema de archivos está montado con "`strictatime` ".

- La lectura de un archivo por primera vez o después de un día cambia la propiedad atime en un sistema GNU/Linux si el sistema de archivos está montado con la opción «`relatime`». (comportamiento por defecto desde Linux 2.6.30)

- La lectura del archivo no cambia su propiedad atime en un sistema GNU/Linux si el sistema de archivos está montado con la opción «`noatime`».

| Nota
Las opciones de montaje «`noatime`» y «`relatime`» se diseñaron para mejorar el desempeño de lectura del sistema de archivos de forma normal. La simple lectura de un archivo con la opción «`strictatime`» genera una operación de escritura para actualizar la propiedad atime. El atributo atime se usa poco excepto para el archivo mbox(5). Consulte mount(8).

Utilice la orden touch(1) para cambiar las marcas de tiempo de los archivos existentes.

Para la fecha, el comando `ls` genera cadenas localizadas en una configuración regional que no es inglesa ("`fr_FR.UTF-8`").

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

| Sugerencia
Consulte Sección 9.3.4, “Personalización de la visualización de la fecha y hora” para personalizar la salida de «`ls -l`».

### 1.2.7. Enlaces

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

- enlace duro,

  - Nombre duplicado de un fichero ya existente

  - «`ln foo bar`»

- Enlace simbólico o «simlink»

  - Fichero especial que apunta a otro fichero por su nombre

  - «`ln -s foo bar`».

Con el siguiente ejemplo se muestra los cambios en el contador de enlaces y las sutiles diferencias de la orden `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 orden ls(1) .

Los enlaces simbólicos siempre tienen permisos de acceso al archivo nominales «`rwxrwxrwx`», como se mostró en el ejemplo anterior, con los permisos reales que tenga el archivo al que referencia.

| Atención
En general es preferible no crear nunca enlaces simbólicos o enlaces duros excepto que tenga poderosas razones. Los enlaces simbólicos puede causar problemas graves al crear bucles en el sistema de archivos.

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

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 proviene de Windows, pronto comprenderá lo bien diseñado que están los enlaces de Unix, comparados con su equivalente en Windows que son los accesos directos (shortcuts). Gracias su 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, ciertamente no existe diferencia.

### 1.2.8. Tuberías con nombre (FIFOs)

Una tubería con nombre es un archivo que se comporta como una tubería. Usted introduce algo dentro del archivo y sale por el otro lado. Por esa razón se dice que es FIFO o primero-en-entrar-primero-en-salir: lo primero que se introduce en la tubería es lo primero en salir por el otro lado.

Si se escribe en una tubería con nombre, los procesos que han escrito en la tubería no pueden terminar hasta que la información que han escrito es leída 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 lo hace 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

### 1.2.9. «Sockets»

Los «sockets» se usan de forma generalizada en las comunicaciones en Internet, bases de datos y sistemas operativos. Son similares a las tuberías con nombre (FIFO) y permiten que los procesos intercambien información entre diferentes equipos. Para los «sockets» los procesos no necesitan estar ejecutandose al mismo tiempo, ni ser hijos del mismo proceso padre. Este es el mejor sistema para la comuniación entre procesos (IPC). El intercambio de información puede ocurrir en la red entre equipos. Los dos tipos de «sockets» más comunes son los «sockets« Internet y los «sockets» de dominio Unix.

| Sugerencia
"`ss -t -u -a`" (from the `iproute2` package) provides a very useful overview of sockets that are open on a given system.

### 1.2.10. Archivos de dispositivos

Los archivos de dispositivos se refieren a dispositivos físicos o virtuales del sistema, como el disco duro, la tarjeta de vídeo, la pantalla o el teclado. Un ejemplo de dispositivo virtual es la consola, representado por «`/dev/console`».

Hay dos tipos de archivos de dispositivo.

- 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 grandes llamadas bloques,

  - 1 bloque > 1 byte,

  - p. ej. un disco duro, …

Los archivos de dispositivos se pueden leer y escribir, aunque el fichero pueda contener datos binarios los cuales son un galimatias incomprensibles para los humanos. Algunas veces escribir datos directamente en esos ficheros puede ayudar a resolver problemas de conexión con los dispositivos. Por ejemplo, se 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
Comúnmente a la impresora se accede utilizando lp(1).

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

    $ 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 dispositivo mayor de 8 y como número de dispositivo menor de 0. Los usuario pueden realizar operaciones de lectura/escritura haciendo si pertenecen al grupo `disk`.

- «`/dev/sr0`» tiene como número de dispositivo mayor de 11 y como menor de 0. Los usuarios pueden realizar operaciones de lectura/escritura si pertenecen al grupo `cdrom`.

- «`/dev/ttyS0`» tiene el número de dispositivo mayor de 4 y menor de 64. Los usuarios pueden realizar operaciones de lectura/escritura si pertenecen al grupo `dialout`.

- «`/dev/zero`» tiene como número mayor de dispositivo 1 y como menor 5. Todos los usuarios pueden realizar operaciones de lectura/escritura.

En un sistema Linux moderno, el sistema de archivos en «`/dev/`» se rellena de forma automática mediante udev(7).

### 1.2.11. Archivos de dispositivos especiales

Existen algunos archivos de dispositivos especiales.

Tabla 1.10. Relación de archivos de dispositivos especiales

archivo de dispositivo | acción | descripción de respuesta
--- | --- | ---
`/dev/null` | lectura | devuelve el «carácter de final de archivo (EOF)»
`/dev/null` | escritura | no devuelve nada (un pozo sin fondo al que enviar datos)
`/dev/zero` | lectura | devuelve «el carácter `\0` (NUL)» (difiere del número cero representado en ASCII)
`/dev/random` | lectura | devuelve caracteres aleatorios creados por el generador de números aleatorios confiable, ofreciendo entropía real (baja)
`/dev/urandom` | lectura | devuelve caracteres de forma aleatoria desde el generador de números pseudo-aleatorios de seguridad criptográfica
`/dev/full` | escritura | devuelve el error de disco lleno (ENOSPC)

Con frecuencia son utilizados en las redirecciones del intérprete de órdenes (consulte Sección 1.5.8, “Secuencias de órdenes comunes y redirecciones del intérprete de órdenes”).

### 1.2.12. procfs y sysfs

Los pseudo sistemas de archivos procfs y sysfs, que se montan en «`/proc`» y «`/sys`», son estructuras de datos internas del núcleo que se muestran al espacio de usuario. Expresado de otra forma, estas entradas son virtuales actúan como una ventana adecuada al funcionamiento del sistema operativo.

El directorio «`/proc`» contiene (entre otras cosas) un subdirectorio por cada proceso que se está ejecutando en el sistema operativo, cuyo nombre es el identificador del proceso (PID). Las herramientas del sistema que acceden a la información de los procesos, como ps(1), obtienen dicha información de la estructura de este directorio.

Los directorios dentro de «`/proc/sys/`» contienen interfaces que permiten cambiar algunos parámetros del núcleo en tiempo de ejecución. (Se puede realizar las mismas operaciones por medio de la orden sysctl(8) o de su archivo de configuración «`/etc/sysctl.d/*.conf`».)

La gente normalmente se alarma del gran tamaño de un archivo en particular, «`/proc/kcore`». Es (más o menos) una copia del contenido de la memoria del equipo. Es útil para depurar el núcleo y es un archivo virtual que es una referencia a la memoria del equipo, así es que no hay que preocuparse por su tamaño.

El subdirectorio "`/sys`" contiene las estructuras de datos del kernel exportadas, sus atributos y los enlaces entre ellos. También contiene interfaces para cambiar ciertos parámetros del kernel que se están ejecutándose.

Consulte «`proc.txt(.gz)`», «`sysfs.txt(.gz)`» y otros documentos que forman parte de la documentación del núcleo de Linux («`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`») incluidos en el paquete `linux-doc-*`.

### 1.2.13. tmpfs

El sistema de archivos temporal tmpfs tiene la función de mantener todos los archivos en la memoria virtual. Los datos de «tmpfs« de la caché de páginas de la memoria se puede enviar al área de intercambio en disco cuando sea necesario.

El directorio «`/run`» se monta como tmpfs al comienzo del proceso de arranque. Así se permite la escritura sobre él, incluso cuando el directorio «`/`» está montado en solo lectura. Aquí se guardan los archivos en estado temporal y sustituye a varios directorios de la Jerarquía Estándar del Sistema de Ficheros versión 2.3:

- «`/var/run`» → «`/run`»,

- «`/var/lock`» → «`/run/lock`»,

- "`/dev/shm`" → "`/run/shm`"

Ver el documento del núcleo de Linux «`tmpfs.txt(.gz)`» («`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`») que está en el paquete `linux-doc-*`.

## 1.3. Midnight Commander (MC)

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 basada en menús que es más sencilla de aprender que las órdenes estándar de Unix.

Necesitará instalar el paquete de Midnight Commander llamado «`mc` como se muestra.

    $ sudo apt-get install mc

Usa el comando mc(1) para explorar el sistema Debian. Esta es la mejor forma de aprender. Por favor, explora algunos lugares interesantes sólo usando las teclas del cursor y la tecla Intro.

- "`/etc`" y sus subdirectorios

- «`/var/log`» y sus subdirectorios

- «`/usr/share/doc`» y sus subdirectorios

- «`/usr/sbin`» y «`/usr/bin`»

### 1.3.1. Personalización de MC

Para cambiar el directorio de trabajo de MC después de salir y no tener que ejecutar una orden `cd` al último directorio, le sugiero que cambie «`~/.bashrc`» para incluir el archivo de órdenes que está en el paquete `mc`.

    . /usr/lib/mc/mc.sh

Consulte mc(1) (en la opción «`-P`») para comprobar por qué. (Si no comprende exactamente lo que estoy diciendo puede hacerlo más tarde.)

### 1.3.2. Comenzando con MC

Para ejecutar MC escribe lo siguiente.

    $ mc

MC permite ejecutar todas las operaciones sobre archivos a través de sus menús, con el mínimo esfuerzo para el usuario. Para acceder a la pantalla de ayuda presione F1. Puede probar MC con solo pulsar las teclas de los cursores y las teclas de función.

| Nota
En algunas consolas como gnome-terminal(1), la pulsación de las teclas de función las recibe la consola. Esta funcionalidad se desactiva en «Editar» → «Atajos de teclado» para `gnome-terminal`.

Si encuentra problemas de codificación de los caracteres y parecen no tener sentido, añadir «`-a`» como parámetro a la orden MC ayudará a evitar problemas.

Si esto no soluciona el problema consulte Sección 8.3.1, “La configuración de la terminal”.

### 1.3.3. Gestor de archivos de MC

Por defecto hay dos paneles con dos directorios y su contenido. Otro modo útil es asignar el panel derecho para que muestre los permisos de los archivos, etc. A continuación mostraremos algunas claves. Con el demonio gpm(8) ejecutándose, se puede usar el ratón en la consola de caracteres de Linux. (Asegúrese de pulsar la tecla de mayúsculas para obtener el comportamiento normal cuando corte y pegue en MC.)

Tabla 1.11. Funciones de las teclas en MC

tecla | función
--- | ---
`F1` | menú de ayuda
`F3` | visión del contenido del archivo
`F4` | editor interno
`F9` | activa el menú superior
`F10` | salida de Midnight Commander
`Tab` | moverse entre los paneles
`Insert` o `Ctrl-T` | marcar el fichero para seleccionar varios para otra operación como copiar
`Del` | borrar el archivo (tenga cuidado---active el modo seguro de borrado en MC)
`Cursores` | se explican por si mismas

### 1.3.4. Trucos de la línea de órdenes en MC

- La orden `cd` cambia el directorio en el panel seleccionado.

- `Ctrl-Intro` o `Alt-Intro` copia el nombre del archivo a la orden en la línea de órdenes Se utiliza en combinación con las órdenes cp(1) y mv(1) para añadir parámetros a las órdenes.

- `Alt-Tab` muestra los posibles archivos elegibles por expansión del nombre en el intérprete de órdenes.

- Se puede especificar los directorios de inicio de ambos paneles como parámetros a MC; por ejemplo, «`mc /etc/root`».

- `Esc` + `tecla numérica n` → `tecla de función n` (p. ej., `Esc` + `1` → `F1`, etc.; `Esc` + `0` → `F10`)

- Pulsando `Esc` antes que la tecla tiene el mismo efecto que presionar `Alt` y otra tecla a la vez.; p. ej. pulse `Esc`+`c` para obtener `Alt-C`. `Esc` la llaman la meta-tecla y algunas veces se representa como «`M-`».

### 1.3.5. El editor interno de MC

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

Este editor puede iniciarse directamente en un fichero utilizando uno de los siguientes comandos.

    $ mc -e filename_to_edit

    $ mcedit filename_to_edit

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-Fn para cambiar entre consolas virtuales y utilice «Archivo→Insertar archivo» o «Archivo→Copiar a un archivo» para mover una parte de un archivo a otro.

El editor interno se puede reemplazar 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 utilizar. Si al principio no está cómodo 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 le parece, mi recomendación es asignarles el valor «`vim`».

Si está incómodo con vim(1) puede utilizar mcedit(1) para la mayor parte de las tareas de administración del sistema.

### 1.3.6. El visor interno de MC

MC posee un visor inteligente. Es una gran herramienta para buscar palabras en los documentos. Siempre lo uso para archivos del directorio «`/usr/share/doc`». Es la manera más rápida de navegar a través de la ingente cantidad de información de Linux. Este visor puede iniciarse de forma separada utilizando una de las órdenes que se muestran.

    $ mc -v path/to/filename_to_view

    $ mcview path/to/filename_to_view

### 1.3.7. Selección inteligente del visor en MC

Pulse Intro en un archivo y el programa, de acuerdo a su contenido, abrirá el archivo (consulte Sección 9.4.11, “Personalizando el inicio de un programa”). Es una funcionalidad de MC muy útil.

Tabla 1.12. Acción de la tecla Intro en MC

tipo de archivo | acción de la tecla Intro
--- | ---
archivo ejecutable | ejecuta la orden
archivo de página de manual | envía el contenido a la aplicación de visualización
archivo html | envía el contenido al navegador web
archivos «`*.tar.gz`» y «`*.deb`» | muestra su contenido como si fuera un subdirectorio

Para que opere de forma correcta el visor y las funciones virtuales de archivo, los archivos visibles no deben tener permisos de ejecución. Puede cambiar su estado con chmod(1) o en el menú de archivo de MC.

### 1.3.8. Sistema de archivos virtual de MC

MC puede acceder a archivos en Internet a través de FTP. Vaya al menú pulsando `F9`, "`Enter`" y "`h`" para activar el sistema de archivos Shell. Escriba la URL con el formato «`sh://[user@]machine[:options]/[remote-dir]`», que abre un directorio remoto que aparece como uno local usando `ssh`.

## 1.4. Fundamentos de entornos de trabajo tipo Unix

Aunque MC permite realizar casi cualquier cosa, es importante aprender a utilizar la línea de órdenes y el intérprete de comandos y acostumbrarse a un entorno de trabajo tipo Unix.

### 1.4.1. El intérprete de órdenes (shell)

Dado que algunos programas de inicialización del sistema pueden usar el shell de inicio de sesión, es prudente mantenerlo como bash(1) y evitar cambiar el shell de inicio de sesión con chsh(1).

Si desea utilizar un prompt interactivo diferente de shell, hágalo desde la configuración del emulador de la terminal GUI o iniciélo desde `~/.bashrc`, por ejemplo, colocando "`exec /usr/bin/zsh -i -l`"o"`exec /usr/bin/fish -i -l`"en ella.

Tabla 1.13. Relación de intérpretes de órdenes

paquete | popularidad | tamaño | Intérprete de órdenes POSIX | descripción
--- | --- | --- | --- | ---
`bash` | V:888, I:999 | 7276 | Sí | Bash: el intérprete de órdenes GNU Bourne Again SHell (estándar de facto)
`bash-completion` | V:36, I:958 | 1952 | N/A | terminación programable para la shell bash
`dash` | V:928, I:998 | 207 | Sí | Intérprete de órdenes Debian Almquist, bueno para archivos de órdenes
`zsh` | V:41, I:70 | 2499 | Sí | Intérprete de órdenes Z: un intérprete de órdenes con muchas mejoras
`tcsh` | V:4, I:15 | 1366 | No | TENEX C Shell: una versión mejorada de Berkeley csh
`mksh` | V:5.4, I:7.9 | 7713 | Sí | Versión de el intérprete de órdenes Korn
`csh` | V:1.1, I:5.4 | 348 | No | Intérprete de órdenes OpenBSD C, una versión de Berkeley csh
`sash` | V:0.3, I:5.2 | 1245 | Sí | Intérprete de órdenes Stand-alone con órdenes internas (no es el estándar «`/usr/bin/sh`»)
`ksh` | V:0.3, I:8.4 | 65 | Sí | la versión AT&T actual del intérprete de órdenes Korn
`rc` | V:0.10, I:0.73 | 182 | No | implementación del intérprete de órdenes rc de AT&T Plan 9
`posh` | V:0.01, I:0.23 | 191 | Sí | Intérprete de órdenes que cumple con las directrices estándar (derivado de `pdksh`)

| Sugerencia
Aunque los intérpretes de órdenes tipo POSIX comparten la sintaxis básica, pueden cambiar el comportamiento de algunos elementos básicos como sus variables o la expansión de nombres de archivos con comodines. Por favor, compruebe su documentación para obtener más detalles.

En este capítulo se sobreentiende que el intérprete de órdenes es `bash`.

### 1.4.2. Personalización de bash

Puede personalizar bash(1) en el archivo de configuración «`~/.bashrc`».

Por ejemplo, pruebe con lo que se muestra.

    # enable bash-completion
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    # CD upon exiting MC
    . /usr/lib/mc/mc.sh

    # set CDPATH to a good one
    CDPATH=.:/usr/share/doc:~:~/Desktop:~
    export CDPATH

    PATH="${PATH+$PATH:}/usr/sbin:/sbin"
    # set PATH so it includes user's private bin if it exists
    if [ -d ~/bin ] ; then
      PATH="~/bin${PATH+:$PATH}"
    fi
    export PATH

    EDITOR=vim
    export EDITOR

| Sugerencia
Puede encontrar más posibilidades de personalización de `bash`, como Sección 9.3.6, “Órdenes coloreadas” en Capítulo 9, Trucos del sistema.

| Sugerencia
El paquete `bash-completion` permite la finalización programable de `bash`.

### 1.4.3. Combinaciones de teclas

En un entorno tipo Unix, hay algunas teclas que tiene un uso especial. Tenga en cuenta que en una consola en modo texto de Linux, solo las teclas `Ctrl` y `Alt` del lado izquierdo funcionan de la forma esperada. He aquí algunas combinaciones de teclas que conviene recordar.

Tabla 1.14. Relación de combinaciones de teclado en bash

tecla | descripción de la combinación de teclas
--- | ---
`Ctrl-U` | borra el contenido desde el cursor al inicio de la línea
`Ctrl-H` | borra el carácter anterior al cursor
`Ctrl-D` | fin de la entrada (finaliza el intérprete de órdenes en uso)
`Ctrl-C` | finaliza el programa en ejecución
`Ctrl-Z` | para temporalmente el programa que pasa a segundo plano
`Ctrl-S` | para la salida por pantalla
`Ctrl-Q` | reanuda la salida por pantalla
`Ctrl-Alt-Del` | reinicia/apaga el sistema, ver inittab(5)
`tecla izquierda Alt` (opcionalmente, `tecla de Windows`) | meta-tecla para Emacs e interfaces similares de usuario
`Up-arrow` | retrocede en el histórico de órdenes `bash`
`Ctrl-R` | búsqueda en el histórico de órdenes de `bash`
`Tab` | completa la entrada de la orden con el nombre de archivo en `bash`
`Ctrl-V` `Tab` | introduce `Tab` sin completar la orden en `bash`

| Sugerencia
La funcionalidad del terminal de `Ctrl-S` puede deshabilitarse con stty(1).

### 1.4.4. Operaciones con el ratón

Las operaciones del ratón para el texto en el sistema Debian mezclan 2 estilos con algunos cambios:

- Operaciones tradicionales del ratón al estilo de Unix:

  - usar 3 botones (clic)

  - usar PRIMARIO/A

  - usado por aplicaciones X tales como `xterm` y aplicaciones de linea de comando en la consola Linux

- Operación del ratón al estilo GUI (interfaz gráfica de usuario) moderna:

  - usar 2 botones (arrastrar + clic)

  - usar PRIMARIO y PORTAPAPELES

  - usado en aplicaciones modernas GUI tales como `gnome-terminal`

Tabla 1.15. Lista de acciones de teclado relacionadas y operaciones con ratón en Debian

acción | respuesta
--- | ---
botón izquierdo y arrastre del ratón | seleccionar un rango como selección PRIMARIA
botón izquierdo | seleccione el inicio del rango para la selección PRIMARIA
botón derecho (tradicional) | seleccione el final del rango para la selección PRIMARIA
botón derecho (moderno) | menú dependiente del contexto (cortar/copiar/pegar)
Clic central o Mayús-`Ins` | insertar selección PRIMARIA en el cursor
`Ctrl-X` | cortar la selección PRIMARIA al PORTAPAPELES
`Ctrl-C` (`Shift-Ctrl-C` en terminal) | copiar la selección PRIMARIA al PORTAPAPELES
`Ctrl-V` | pegue el contenido de CLIPBOARD en la ubicación del cursor

Aquí, la selección PRIMARIA es el rango de texto resaltado. Dentro del programa de terminal, `Shift-Ctrl-C` se usa en su lugar para evitar terminar un programa en ejecución.

La rueda central del ratón moderno se considera el botón central del mismo y se puede usar para hacer clic en el medio. Hacer clic en los botones izquierdo y derecho del ratón al mismo tiempo equivale como clic central en los ratones de 2 botones.

Para usar un ratón en las consolas de caracteres de Linux, debe tener gpm(8) ejecutándose como daemon.

### 1.4.5. El paginador

La orden less(1) es un paginador mejorado (permite navegar por el contenido de los archivos). Lee el archivo indicado como parámetro en su orden o la entrada estándar. Pulse «`h`» si necesita ayuda mientras utiliza la orden `less`. Es más capaz que more(1) y se puede mejorar ejecutando «`eval $(lesspipe)`» o «`eval $(lessfile)`» en el archivo de órdenes de inicio. Ver «`/usr/share/doc/less/LESSOPEN`». La opción «`-R`» permite la salida en crudo y permite las secuencias de escape ANSI coloreadas. Ver less(1).

| Sugerencia
En el comando `less`, escriba "`h`" to see the help screen, type "`/`" o "`?`" to search a string, and type "`-i`" para cambiar la sensibilidad entre mayúsculas y minúsculas.

### 1.4.6. El editor de texto

Debería ser competente con Vim o Emacs que son habituales en los sistemas tipo Unix.

Pienso que el correcto es Vim, ya que el editor Vi esta siempre disponible en el mundo Linux/Unix. (En realidad, los programas, bien el original `vi` o el nuevo`nvi` los puede encontrar en cualquier lugar. Yo elegí Vim en vez de la versión nueva ya que ofrece ayuda a través de tecla `F1` siendo similar y más potente.)

Si elige Emacs o XEmacs como su editor también son buenas opciones, especialmente 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 se necesita en Linux es Emacs. Aprender Emacs durante diez minutos ahora puede ahorrar muchas horas después. Es recomendable usar el manual de GNU Emacs para aprender.

Todos estos programas normalmente incluyen un tutorial para que pueda aprender a través de la práctica. Se inicia en «`vim`» pulsando la tecla F1. Debería al menos leer las primeras treinta y cinco líneas. Después realizar el curso de entrenamiento posicionando el cursor en«`|tutor|`» y pulsando `Ctrl-]`.

| 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 idea 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 sobre texto multibyte.

### 1.4.7. Configuración del editor de texto por defecto

Debian tiene un buen número de editores. Recomendamos instalar el paquete `vim`, como ya hemos mencionado.

Debian tiene un acceso unificado al editor por defecto del sistema mediante la orden «`/usr/bin/editor`», y así otros programas (p. ej. reportbug(1)) puedan llamarlo. Puede cambiarlo como se muestra.

    $ sudo update-alternatives --config editor

Mi recomendación es la opción «`/usr/bin/vim.basic`» mejor que «`/usr/bin/vim.tiny`» para los usuario noveles ya que permite realzado de sintaxis.

| Sugerencia
Muchos programas utilizan las variables de entorno «`$EDITOR`» o «`$VISUAL`» para determinar el editor a usar (ver Sección 1.3.5, “El editor interno de MC” y Sección 9.4.11, “Personalizando el inicio de un programa”). Para un sistema Debian coherente asigne este valor a «`/usr/bin/editor`». (Históricamente, «`$EDITOR`» era «`ed`» y «`$VISUAL`» era «`vi`».)

### 1.4.8. Usando vim

El reciente vim(1) se inicia en la sana opción "`incompatible`" y entra en el modo `NORMAL`.[1]

Tabla 1.16. Lista de comandos básicos de Vim

modo | entradas con el teclado | acción
--- | --- | ---
`NORMAL` | `:help|only` | mostrar el archivo de ayuda
`NORMAL` | `:e filename.ext` | abrir un nuevo búfer para editar `filename.ext`
`NORMAL` | `:w` | sobrescribir el búfer actual en el archivo original
`NORMAL` | `:w filename.ext` | escribir el búfer actual en `filename.ext`
`NORMAL` | `:q` | salir `vim`
`NORMAL` | `:q!` | forzar salir `vim`
`NORMAL` | `:only` | cierre todas las demás ventanas abiertas
`NORMAL` | `:set nocompatible?` | comprobar si `vim` está en el modo `incompatible`
`NORMAL` | `:set nocompatible` | establecer `vim` en el modo `incompatible`
`NORMAL` | `i` | pulse el modo `INSERTAR`
`NORMAL` | `R` | entrar en el modo `REEMPLAZAR`
`NORMAL` | `v` | entrar en el modo `VISUAL`
`NORMAL` | `V` | ingrese al modo lineal `VISUAL`
`NORMAL` | Ctrl-`V` | Ingresar al modo `VISUAL` en bloque
excepto `TERMINAL-JOB` | Tecla `ESC` | entrar al modo `NORMAL`
`NORMAL` | `:term` | entrar al modo `TERMINAL-JOB`
`TERMINAL-NORMAL` | `i` | entrar al modo `TERMINAL-JOB`
`TERMINAL-JOB` | Ctrl-`W` `N` (o Ctrl-`\` Ctrl-`N`) | entre el modo `TERMINAL-NORMAL`
`TERMINAL-JOB` | Ctrl-`W` `:` | entre el modo `Ex`-en modo `TERMINAL-NORMAL`

Por favor use el programa "`vimtutor`" para aprender `vim` en un curso con tutorial interactivo.

El programa `vim` cambia su comportamiento al pulsar las teclas basadas en modo. La mayoría de las pulsaciones de teclas en el búfer se realizan en modo `INSERTAR` y modo `REEMPLAZAR`. El movimiento del cursor se realiza principalmente en modo `NORMAL`. La selección interactiva se realiza en modo `VISUAL`. Escribir "`:`" en modo `NORMAL` cambia su modo a `Ex`-modo. El modo `Ex` acepta comandos.

| Sugerencia
El Vim viene con el paquete Netrw. ¡Netrw admite la lectura de archivos, la escritura de archivos, la exploración de directorios en una red y la exploración local! Pruebe Netrw con "`vim .`" (un punto como argumento) y lea su manual en "`:help netrw`".

Para la configuración avanzada de `vim`, ver Sección 9.2, “Personalización de vim”.

### 1.4.9. Grabación de las actividades del intérprete de órdenes

La salida del intérprete de órdenes puede colapsar su pantalla y puede perderse para siempre. Es una buena práctica registrar la actividad del intérprete de órdenes en un archivo para poder revisarlo más tarde. Este registro es esencial para llevar a buen término cualquier tarea de administración de un sistema.

| Sugerencia
El nuevo Vim (versión> = 8.2) se puede usar para registrar las actividades de shell limpiamente usando el modo `TERMINAL-JOB`. Consulte Sección 1.4.8, “Usando vim”.

El método básico de registro del intérprete de órdenes es operar con script(1).

Por ejemplo, intente lo siguiente

    $ script
    Script started, file is typescript

Ejecute las órdenes que desee después de `script`.

Pulse `Ctrl-D` para finalizar `script`.

    $ vim typescript

Consulte Sección 9.1.1, “Registro correcto de las actividades del intérprete de órdenes”.

### 1.4.10. Órdenes básicas de Unix

Aprendamos las órdenes fundamentales de UNIX. Aquí utilizaremos «Unix» en su sentido genérico. Normalmente cualquier sistema operativo tipo Unix tiene un conjunto de órdenes similares. El sistema Debian no es una excepción. No se preocupe si en este momento algunas órdenes no funcionan como esperaba. Si se utiliza `alias` en el intérprete de órdenes, las salidas de las órdenes correspondientes difieren. Estos ejemplos no pretenden ejecutarse en orden.

Pruebe las siguientes órdenes desde una cuenta de usuario sin privilegios.

Tabla 1.17. Relación 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 de «`foo`»
`type -p commandname` | muestra la ubicación del archivo de la orden «`nombre_de_la_orden`»
`which commandname` | , ,
`type commandname` | muestra información de la orden «`nombre_de_la_orden`»
`apropos key-word` | encuentra órdenes relacionadas con la «`palabra_clave`»
`man -k key-word` | , ,
`whatis commandname` | muestra una descripción de una línea de la orden «`nombre_de_la_orden`»
`man -a commandname` | muestra la descripción de la orden «`nombre_de_la_orden`» (al estilo Unix)
`info commandname` | muestra una descripción detallada de la orden «`nombre_de_la_orden`» (al estilo GNU)
`ls` | relación el contenido del directorio (excluye aquellos archivos o directorios que comienzan por .)
`ls -a` | relación el contenido del directorio (todos los archivos y directorios)
`ls -A` | relación el contendido del directorio (casi todos los archivos y directorios, a saber, oculta «`..`» y «`.`»)
`ls -la` | relación todo el contenido del directorio con información detallada
`ls -lai` | relación el contenido completo del directorio con el número del inodo e información detallada
`ls -d` | relación los directorios que cuelgan del directorio actual
`tree` | muestra el contenido de los directorios en formato de árbol
`lsof foo` | relación de los procesos que tienen abierto el archivo «`foo`»
`lsof -p pid` | relación de los archivos abiertos por el proceso con el identificador: «`pid`»
`mkdir foo` | crear un nuevo directorio «`foo`» en el directorio actual
`rmdir foo` | borra el directorio «`foo`» del directorio actual
`cd foo` | cambia al directorio «`foo`» que se encuentre en el directorio actual o en los directorios incluidos en la variable «`$CDPATH`»
`cd /` | cambia al directorio raíz
`cd` | cambia al directorio principal del usuario actual
`cd /foo` | cambia al directorio con ruta absoluta «`foo`»
`cd ..` | cambia al directorio padre
`cd ~foo` | cambia al directorio principal del usuario «`foo`»
`cd -` | cambia al directorio anterior
`</etc/motd pager` | muestra el contenido de «`/etc/motd`» usando el paginador por defecto
`touch junkfile` | crea un archivo vacío «`junkfile`»
`cp foo bar` | copia el archivo existente «`foo`» en un archivo nuevo «`bar`»
`rm junkfile` | borra el archivo «`junkfile`»
`mv foo bar` | renombra el archivo existente «`foo`» con un 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 nombre nuevo «`bar/baz`» (el directorio «`bar`» debe existir con anterioridad pero el archivo «`bar/baz`» no)
`chmod 600 foo` | el archivo existente «`foo`» únicamente tiene permisos de lectura y escritura para el dueño (y no se permite la ejecución por nadie)
`chmod 644 foo` | hace que un archivo existente «`foo`» lo pueda leer cualquiera, que únicamente el dueño pueda escribir sobre él (y nadie puede ejecutarlo)
`chmod 755 foo` | hace que un archivo «`foo`» pueda ser leído por cualquiera y modificado solo por el dueño (cualquiera puede ejecutarlo)
`find . -name pattern` | encuentra archivos que cumplen la «`expresión_regular`» del intérprete de órdenes (lento)
`locate -d . pattern` | encuentra archivos que cumplen «`expresión_regular`» del intérprete de órdenes (rápido ya que utiliza una base de datos que se actualiza de forma periódica)
`grep -e "pattern" *.html` | buscar un patrón " `` " en todos los archivos que terminen con " `.html` " en el directorio actual y mostrarlos todos
`top` | muestra información de los procesos a pantalla completa, pulsando «`q`» para terminar
`ps aux | pager` | muestra información de todos los procesos ejecutándose utilizando para la salida el estilo BSD
`ps -ef | pager` | muestra información de todos los procesos ejecutándose utilizando para la salida el estilo Unix system-V
`ps aux | grep -e "[e]xim4*"` | muestra todos los procesos «`exim`» y «`exim4`»
`ps axf | pager` | muestra información de todos los procesos con la salida al estilo de arte ASCII
`kill 1234` | elimina el proceso cuyo identificador de proceso es: «1234»
`gzip foo` | comprime «`foo`» y crea «`foo.gz`» usando la codificación Lempel-Ziv (LZ77)
`gunzip foo.gz` | descomprimir "`foo.gz`" para crear "`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` | comprimir "`foo`" para crear "`foo.xz`" utilizando el algoritmo de cadena Lempel-Ziv-Markov (mejor compresión que `bzip2`)
`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/` | archiva el contenido de la carpeta «`bar/`» en el archivo «`foo.tar`»
`tar -cvzf foo.tar.gz bar/` | archiva el contenido de la carpeta «`bar/`» en el archivo comprimido «`foo.tar.gz`»
`tar -cvjf foo.tar.bz2 bar/` | archiva el contenido de la carpeta «`bar/`» en el archivo «`foo.tar.bz2`»
`tar -cvJf foo.tar.xz bar/` | archiva el contenido de la carpeta «`bar/`» en el archivo «`foo.tar.xz`»
`zcat README.gz | pager` | mostrar 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

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

Para la orden `cd`, consulte builtins(7).

El paginador por defecto del sistema Debian es more(1) que es básico y no permite el desplazamiento para atrás. La instalación del paquete `less` con la orden «`apt-get install less`», convertirá a less(1) en el paginador por defecto y este sí permite el desplazamiento hacia atrás con las teclas de cursor.

En la expresión regular de la orden «`ps aux | grep -e «[e]xim4*«`», «`[`» y «`]`» permite a `grep` que no encaje consigo mismo. La expresión regular «`4*`» significa cero o más repeticiones del carácter «`4`» y de este modo permite a `grep` encajar con «`exim`» y con «`exim4`». Aunque el intérprete de órdenes utiliza «`*`» para el completado de nombres y las expresiones regulares, sus significados son distintos. Aprenda expresiones regulares consultando grep(1).

Por favor, para entrenar recorra los directorios y de un vistazo al sistema utilizando las órdenes que acabamos de introducir. Si tiene dudas sobre cualquier orden de consola, asegúrese 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 de manual puede ser un poco áspero, ya que puede ser bastante conciso, especialmente las más antiguas y típicas pero una vez que se acostumbre, llegará a apreciar su concisión.

Recuerde que muchas órdenes de la familia Unix, incluidas las que provienen 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).

    $ commandname --help
    $ commandname -h

## 1.5. Órdenes simples para el intérprete de órdenes

Ahora ya tiene una idea de como utilizar un sistema Debian. Vamos a ver 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. Para una explicación más completa consultar bash(1).

Un comando simple es una secuencia de componentes.

1. asignación de variables (opcional),

2. nombre de la orden,

3. parámetros (opcional),

4. redirecciones (optional: `>` , `>>` , `<` , `<<` , etc.),

5. operadores de control (optional: `&&` , `||` , nueva_línea , `;` , `&` , `(` , `)` ).

### 1.5.1. Ejecución de órdenes y variables de entorno

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

Los valores predeterminados de las variables de entorno los estable inicialmente el sistema PAM y luego algunos de ellos se pueden restablecer por algunos programas de la aplicación.

- El sistema PAM como `pam_env` puede establecer variables de entorno mediante `/etc/pam.conf`", "`/etc/environment`" y "`/etc/default/locale`".

- The modern GUI environment run from the user mode systemd unit (see systemd.unit(5)) sets its environment variables by a file in the "`~/.config/environment.d/`" directory.

- La inicialización del programa específico del usuario puede reajustar variables del entorno por "`~/.profile`", "`~/.bash_profile`"y"`~/.bashrc`".

### 1.5.2. La variable «`$LANG`»

La configuración regional predeterminada se define en la variable de entorno "`$LANG`" y se configura como "`LANG=xx_YY.UTF-8`" por el instalador o por la configuración posterior de la GUI, por ejemplo, "Configuración" → "Región e idioma" → "Idioma" / "Formatos" para GNOME.

| Nota
Recomiendo que se configure el entorno del sistema sólo con la variable "`$LANG`" por ahora y mantenerse alejado de las variables "`$LC_*`" a menos que sea absolutamente necesario.

La variable de la configuración regional «`$LANG`» tiene tres partes: «`xx_YY.ZZZZ`».

Tabla 1.18. Tres partes del valor de la configuración regional

valor de configuración regional | significado
--- | ---
`xx` | códigos de la lengua según la ISO 639 (en minúsculas) como «en»
`YY` | código del país de la ISO 3166 (en mayúsculas) como «US»
`ZZZZ` | codificación de caracteres, siempre «UTF-8»

Tabla 1.19. Relación de recomendaciones para la configuración regional

recomendación de la configuración regional | lengua (territorio)
--- | ---
`en_US.UTF-8` | Inglés (USA)
`en_GB.UTF-8` | Inglés (Gran Bretaña)
`fr_FR.UTF-8` | Francés (Francia)
`de_DE.UTF-8` | Alemán (Alemania)
`it_IT.UTF-8` | Italiano (Italia)
`es_ES.UTF-8` | Español (España)
`ca_ES.UTF-8` | Catalán (España)
`sv_SE.UTF-8` | Sueco (Suecia)
`pt_BR.UTF-8` | Portugués (Brasil)
`ru_RU.UTF-8` | Ruso (Rusia)
`zh_CN.UTF-8` | Chino (República Popular de China)
`zh_TW.UTF-8` | Chino (República de China (Taiwan))
`ja_JP.UTF-8` | Japonés (Japón)
`ko_KR.UTF-8` | Coreano (República de Corea)
`vi_VN.UTF-8` | Vietnamita (Vietnam)

La forma más común de ejecutar la orden en un intérprete de órdenes es como se muestra.

    $ echo $LANG
    en_US.UTF-8
    $ date -u
    Wed 19 May 2021 03:18:43 PM UTC
    $ LANG=fr_FR.UTF-8 date -u
    mer. 19 mai 2021 15:19:02 UTC

Aquí, el programa date(1) se ejecuta con valores locales diferentes.

- En la primera orden «`$LANG`» tiene el valor por defecto de la configuración regional «`en_US.UTF-8`».

- En la segunda orden «`$LANG`» asigna la configuración regional a francés UTF-8 con el valor «`fr_FR.UTF-8`».

La mayor parte de las órdenes ejecutadas no van precedidas de la definición de variables de entorno. Otra forma alternativa del ejemplo anterior es la que se muestra.

    $ LANG=fr_FR.UTF-8
    $ date -u
    mer. 19 mai 2021 15:19:24 UTC

| Sugerencia
Cuando envíe un informe de error, es una buena idea ejecutar y comprobar el comando bajo la configuración regional "`en_US.UTF-8`" si utiliza un entorno distinto al inglés.

Consultar Sección 8.1, “Configuración regional” para obtener más detalles de la configuración regional.

### 1.5.3. La variable «`$PATH`»

Cuando escribe una orden en el intérprete de órdenes, este busca la orden en la relación de directorios contenidos en la variable de entorno «`$PATH`». El valor de la variable de entorno «`$PATH`» también se le conoce como la ruta de búsqueda del intérprete de órdenes.

En la instalación por defecto de Debian, la variable de entorno «`$PATH`» de las cuentas de usuario puede no incluir «`/usr/sbin`» y «`/usr/sbin`». Por ejemplo, la orden `ifconfig` necesita ser ejecutada con la ruta completa con «`/usr/sbin/ifconfig`». (Órdenes parecidas como `ip` están ubicadas en «`/usr/bin`».)

Puede cambiar la variable de entorno "`$PATH`" del shell Bash mediante los archivos "`~/.bash_profile`" o "`~/.bashrc`".

### 1.5.4. La variable «`$HOME`»

Muchas órdenes almacenan configuraciones específicas del usuario en su directorio principal y cambian su comportamiento en función de estas. El directorio principal del usuario es determinado por el valor de la variable de entorno «`$HOME`».

Tabla 1.20. Relación de valores de «`$HOME`»

valor de «`$HOME`» | características de ejecución del programa
--- | ---
`/` | programa ejecutándose por el proceso init (demonio)
`/root` | programa ejecutándose desde el intérprete de órdenes del superusuario
`/home/normal_user` | programa ejecutándose desde el intérprete de órdenes de un usuario normal
`/home/normal_user` | programa ejecutándose desde el menú en el escritorio gráfico de un usuario normal
`/home/normal_user` | programa ejecutándose como superusuario con «`sudo programa`»
`/root` | programa ejecutándose como superusuario con «`sudo -H programa`»

| Sugerencia
El intérprete de órdenes sustituye «`~/`» por el directorio principal del usuario actual, esto es, «`$HOME/`». El intérprete de órdenes sustituye «`~foo/`» por el directorio principal del usuario `foo`, a saber, «`/home/foo/`».

Ver Sección 12.1.5, “Variables del entorno de shell” si `$HOME` no está disponible para su programa.

### 1.5.5. Opciones de la línea de órdenes

Algunas órdenes tienen parámetros. Se llaman opciones a los parámetros que comienzan con «`-`» o «`--`» y controlan el comportamiento de la orden.

    $ date
    Thu 20 May 2021 01:08:08 AM JST
    $ date -R
    Thu, 20 May 2021 01:08:12 +0900

En este caso, el argumento de la línea de comandos "`-R`" cambia el comportamiento de date(1) para mostrar una cadena de fecha compatible con RFC2822.

### 1.5.6. Expansión de un patrón en el intérprete de órdenes

A menudo querrá que una orden afecte a un grupo de archivos sin escribir el nombre de cada uno de ellos. Para cubrir esta necesidad existe la expansión de patrones de nombres de archivos dentro del intérprete de órdenes glob, (algunas veces también llamado uso de comodines).

Tabla 1.21. Patrones para la expansión de nombres de archivos del intérprete de órdenes

patrón | descripción de la regla de encaje
--- | ---
`*` | nombres de archivos que no comienza con «`.`»
`.*` | nombres de archivos que comienza con «`.`»
`?` | un único carácter
`[…]` | un único carácter que pertenezca al grupo de caracteres entre corchetes
`[a-z]` | un único carácter con cualquier valor comprendido entre «`a`» y «`z`»
`[^…]` | un único carácter que no pertenezca al grupo de caracteres encerrados entre corchetes (excluyendo «`^`»)

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

Ver glob(7).

| Nota
Si prueba «`*`» en la orden find(1) con «`-name`» test etc., encajará «`.`» como parte inicial del nombre de archivo, al contrario que en la expansión de nombres del intérprete de órdenes . (Funcionalidad nueva de POSIX)

| Nota
BASH puede cambiar el comportamiento de la expansión de nombres de archivo con sus opciones internas como «`dotglob`», «`noglob`», «`nocaseglob`», «`nullglob`», «`extglob`», etc. Ver bash(1).

### 1.5.7. Valor devuelto por la orden

Cada orden devuelve su estado de salida en el valor devuelto (en la variable: «`$?`»).

Tabla 1.22. Códigos de salida de una orden

estado de salida de una orden | valor numérico devuelto | valor lógico devuelto
--- | --- | ---
éxito | cero, 0 | VERDAD
error | diferente de cero, -1 | FALSO

Por ejemplo, pruebe con lo que se muestra.

    $ [ 1 = 1 ] ; echo $?
    0
    $ [ 1 = 2 ] ; echo $?
    1

| Nota
Tenga en cuenta que en el contexto lógico del intérprete de órdenes, éxito es tratado de forma lógica como CIERTO que tiene un valor 0 (cero). Quizá esto sea poco intuitivo y por ello se necesite recordar.

### 1.5.8. Secuencias de órdenes comunes y redirecciones del intérprete de órdenes

Intentemos recordar las siguientes expresiones como parte de una orden de una única línea.

Tabla 1.23. Expresiones de una orden

expresión de la orden | descripción
--- | ---
`command &` | ejecución en segundo plano de la `orden` en un intérprete de órdenes hijo
`command1 | command2` | envía a la tubería la salida estándar de la `orden1` a la entrada estándar de la `orden2` (se ejecutan de forma concurrente )
`command1 2>&1 | command2` | envía a la tubería la salida estándar y el error estándar de la `orden1` a la entrada estándar de la `orden2` (se ejecutan de forma concurrente )
`command1 ; command2` | ejecuta la `orden1` y la `orden2` de forma secuencial
`command1 && command2` | ejecuta la `orden1`; y si ha tenido éxito, ejecuta la `orden2` secuencialmente (devuelve éxito si tanto la `orden1` como la `orden2` finalizan con éxito)
`command1 || command2` | ejecuta la `orden1`; si no tiene éxito, se ejecuta la `orden2` de forma secuencial (devuelve éxito si `orden1` o `orden2` se ejecutan con éxito)
`command > foo` | redirecciona la salida estándar de la `orden` al archivo `foo` (y si existe lo sobreescribe)
`command 2> foo` | redirecciona el error estándar de `orden` al archivo `foo` (sobreescribiendolo)
`command >> foo` | redirecciona la salida estándar de `orden` al archivo`foo` (concatenándola)
`command 2>> foo` | redirecciona el error estándar de `orden` al archivo `foo` (concatenándola)
`command > foo 2>&1` | redirecciona salida estándar y el error estándar de `orden` al archivo `foo`
`command < foo` | envía a la entrada estándar de la `orden` a un archivo `foo`
`command << delimiter` | envía a la entrada estándar de la `orden` a las líneas siguientes hasta que encuentra un «`delimitador`» (aquí el documento)
`command <<- delimiter` | envía a la entrada estándar de la `orden` a las líneas siguientes hasta que se encuentre con el «`delimitador`» ( en las líneas de entrada se eliminan los tabuladores al inicio)

El sistema Debian es un sistema multitarea. Mediante trabajos en segundo plano se pueden ejecutar por parte de los usuario múltiples programas desde un único intérprete de órdenes. La gestión de los procesos en segundo plano se realiza con las órdenes internas: `jobs`, `fg`, `bg` y `kill`. Por favor, ver las secciones de bash(1) «SIGNALS», «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 son equivalentes, el último ejemplo ejecuta una orden más `cat` y desperdicia recursos sin razón alguna.

El intérprete de órdenes permite abrir archivos utilizando la orden interna `exec` 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.

Tabla 1.24. Descriptores de archivos predefinidos

dispositivo | descripción | descriptor de archivo
--- | --- | ---
`stdin` | entrada estándar | 0
`stdout` | salida estándar | 1
`stderr` | error estándar | 2

### 1.5.9. Alias de órdenes

Usted puede definir alias para las órdenes más utilizadas.

Por ejemplo, intente lo siguiente

    $ alias la='ls -la'

Ahora, «`la`» funciona como forma corta de «`ls -la`» la cual muestra una relación de todos los archivos en el formato largo.

Se pueden enumerar los alias existentes mediante `alias` (ver el epígrafe «SHELL BUILTIN COMMANDS» de bash(1)).

    $ alias
    ...
    alias la='ls -la'

Se puede determinar la ruta exacta o la identidad de la orden mediante «`type`» (ver el epígrafe «SHELL BUILTIN COMMANDS» de bash(1)).

Por ejemplo, intente lo siguiente

    $ type ls
    ls is hashed (/bin/ls)
    $ type la
    la is aliased to ls -la
    $ type echo
    echo is a shell builtin
    $ type file
    file is /usr/bin/file

En el ejemplo anterior `ls` fue consultado recientemente y «`file`» no lo fue, de este modo «`ls`» está indexado, a saber, el intérprete de órdenes tiene un registro interno que determina rápidamente la ubicación de la orden «`ls`».

| Sugerencia
Ver Sección 9.3.6, “Órdenes coloreadas”.

## 1.6. Operaciones de texto al estilo de Unix

En un entorno de trabajo del estilo de Unix, el tratamiento de texto se realiza mediante el uso de tuberías que unen un conjunto de herramientas para formar una cadena. Esta fue otra de las innovaciones esenciales de Unix.

### 1.6.1. Herramientas de texto Unix

Algunas herramientas que trabajan con texto se usan muy frecuentemente en un sistema tipo Unix.

- No se usan expresiones regulares:

  - cat(1) concatena archivos y muestra el contenido completo.

  - tac(1) concatena archivos y sale en sentido inverso.

  - cut(1) selecciona las partes de las líneas y las salidas.

  - head(1) muestra la primera parte de los archivos.

  - tail(1) muestra la última parte de los archivos.

  - sort(1) ordena las líneas de los archivos de texto.

  - uniq(1) elimina las líneas duplicadas de un archivo ya ordenado.

  - tr(1) traduce o borra caracteres.

  - diff(1) compara archivos línea a línea.

- La expresión regular básica (BRE) se utiliza por defecto:

  - ed(1) es un editor de líneas antiguo.

  - sed(1) es un editor de flujos.

  - grep(1) compara el texto con otros patrones.

  - vim(1) es un editor de pantalla.

  - emacs(1) es un editor interactivo (en cierta manera amplía BRE).

- Las expresiones regulares ampliadas (ERE son utilizadas por:

  - awk(1) realiza un simple procesamiento de texto.

  - egrep(1) hace coincidencias de los patrones en el texto.

  - `tcl`(3tcl) puede hacer cualquier procesamiento de texto imaginado: Ver re_syntax(3). A menudo se utiliza con `tk`(3tk).

  - perl(1) puede hacer cualquier procesamiento de texto que imágenes. Ver perlre(1).

  - pcre2grep(1) del paquete `pcre2-util` empareja texto con el patrón Perl Compatible Regular Expressions (PCRE).

  - python(1) utilizando el módulo `re` puede realizar cualquier procesamiento de textos imaginable. Ver «`/usr/share/doc/python/html/index.html`».

Si no esta seguro de que hacen exactamente estas órdenes, por favor utilice «`man orden`» para averiguarlo por usted mismo.

| Nota
El orden de clasificación y la expresión de rango dependen de la configuración regional. Si desea obtener un comportamiento tradicional para un comando, use la configuración regional C o la configuración regional C.UTF-8 en lugar de la configuración regional normal UTF-8 (ver Sección 8.1, “Configuración regional”).

| Nota
Las expresiones regulares 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 tradicionales ERE.

### 1.6.2. Expresiones regulares

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

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

Un metacarácter es un carácter que tiene un significado especial. Existen dos tendencias principales, BRE y ERE dependiendo de cada herramienta de texto, como ya se ha descrito.

Tabla 1.25. Metacaracteres para BRE y ERE

BRE | ERE | descripción de la expresión regular
--- | --- | ---
`\ . [ ] ^ $ *` | `\ . [ ] ^ $ *` | metacaracteres comunes
`\+ \? \( \) \{ \} \|` |  | sólo en BRE metacaracteres escapados con «`\`»
| `+ ? ( ) { } |` | sólo en ERE metacaracteres no escapados con "`\`"
`c` | `c` | que encaja con el no metacarácter «`c`»
`\c` | `\c` | encaja con un carácter literal «`c`» incluso si «`c`» representa un metacarácter
`.` | `.` | encaja cualquier carácter incluyendo el de nueva línea
`^` | `^` | posición al comienzo de la cadena de caracteres
`$` | `$` | posición al final de la cadena de caracteres
`\<` | `\<` | posición al comienzo de la palabra
`\>` | `\>` | posición al final de la palabra
`[abc…]` | `[abc…]` | encaja cualquier carácter incluido en «`abc...`»
`[^abc…]` | `[^abc…]` | coincide con cualquier carácter excepto en "`abc...`"
`r*` | `r*` | coincide con cero o más expresiones regulares identificadas por "`r` "
`r\+` | `r+` | coinciden con una o varias expresiones regulares identificadas por "`r`"
`r\?` | `r?` | coinciden con ninguna o una expresión regular identificada por "`r`"
`r1\|r2` | `r1|r2` | encaja una de las expresiones regulares «`r1`» o «`r2`»
`\(r1\|r2\)` | `(r1|r2)` | coincide con una de las expresiones regulares identificadas por «`r1`» o «`r2`» y la trata como una expresión regular entre paréntesis

`Emacs` utiliza principalmente el tipo de expresión regular BRE pero se ha ampliado para utilizar «`+`» y «`?`» como metacaracteres como en ERE. Por lo tanto no es necesario añadirles el prefijo «`\`» en las expresiones regulares de `emacs`.

grep(1) puede utilizarse para realizar búsquedas 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

| Sugerencia
Ver Sección 9.3.6, “Órdenes coloreadas”.

### 1.6.3. Sustitución de expresiones

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

Tabla 1.26. Sustitución mediante expresiones regulares

expresión sustituida | descripción del texto para reemplazar la expresión de reemplazo
--- | ---
`&` | lo que encaja con la expresión regular (usar `\&` en `emacs`)
`\n` | lo que encaja con la n enésima expresión regular entre paréntesis (donde «n» es un número)

Para la sustitución de cadenas en Perl se usa "$&" en lugar de "&" y "$n" en lugar de "\n".

Por ejemplo, intente lo siguiente

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

En la sustitución de texto, en las diferentes herramientas, prestar especial atención al encaje de las expresiones regulares entre corchetes o paréntesis con las cadenas de caracteres.

Algunos editores permiten la utilización de expresiones regulares para la búsqueda y/o sustitución de texto.

En el intérprete de órdenes se puede escribir una misma orden en varias líneas anteponiendo el caraćter de barra invertida «`\`» al carácter de nueva línea que será sustituido por el vacío.

Por favor, consultar las páginas de manual de estas órdenes.

### 1.6.4. Sustituciones globales mediante expresiones regulares

La orden 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 orden sed(1) sustituye todas las ocurrencias de «`LA_EXPRESIÓN_REGULAR`» por «`EL_TEXTO`» en el «`archivo`».

    $ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

La orden vim(1) puede sustituir todas las ocurrencias de «`LA_EXPRESIÓN_REGULAR`» por «`EL_TEXTO`» en el «`archivo`» utilizando las órdenes ex(1).

    $ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+update' '+q' file

| Sugerencia
La bandera «`c`» de la orden anterior hace que se pida la confirmación interactiva de cada una de las sustituciones.

Se pueden procesar varios archivos de forma similar («`archivo1`», «`archivo2`» y «`archivo3`») mediante las expresiones regulares de vim(1) o perl(1).

    $ vim '+argdo %s/FROM_REGEX/TO_TEXT/gce|update' '+q' file1 file2 file3

| Sugerencia
La bandera "`e`" en lo anterior evita que el error "No match" rompa un mapeo.

    $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

En el ejemplo en perl(1), «`-i`» es para la edición de cada elemento que encaja con el patrón y «`-p`» se utiliza para repetir la operación sobre cada uno de los archivos que aparecen como argumentos.

| Sugerencia
El uso del argumento «`-i.bak`» en vez de «`-i`» mantiene cada archivo original añadiéndole «`.bak`» al nombre del archivo. Esto permite deshacer los cambios de forma sencilla si nos hemos equivocado al realizar la sustitución.

| Nota
ed(1) y vim(1) utiliza BRE; perl(1) utiliza ERE.

### 1.6.5. Extracción de datos en archivos de texto en forma de tabla

Consideremos un archivo de texto llamado «`DPL`» con los siguientes campos: nombres de los líderes del proyecto Debian con anterioridad a 2004 y su fecha de inicio, utilizando como separador el espacio en blanco.

    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
Ver «Una breve historia de Debian» para conocer quién es el último líder del proyecto Debian.

Awk se utiliza a menudo para obtener datos de este tipo de archivos.

Por ejemplo, intente lo siguiente

    $ awk '{ print $3 }' <DPL                   # month started
    August
    April
    January
    January
    April
    April
    March
    $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
    Ian     Murdock   August  1993
    Ian     Jackson   January 1998
    $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
    April 1996

Los intérprete de órdenes, como Bash, se pueden usar para analizar este tipo de archivos.

Por ejemplo, intente lo siguiente

    $ while read first last month year; do
        echo $month
      done <DPL
    ... same output as the first Awk example

Aquí la orden interna `read` usa los caracteres de «`$IFS`» (separadores internos) para dividir las líneas en palabras.

Si cambia el valor «`$IFS`» a «`:`», puede analizar «`/etc/passwd`» con el intérprete de órdenes de la forma adecuada.

    $ oldIFS="$IFS"   # save old value
    $ 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"   # restore old value

(Para hacer lo mismo con Awk asigne el separador de campos mediante «`FS=':'`».)

El intérprete de órdenes utiliza IFS para separar los resultados de la expansión de parámetros, sustitución de órdenes y expansiones aritméticas. Las palabras entre comillas dobles o simples no se tienen en cuenta en estas operaciones. El valor por defecto de IFS es la relación espacio, tabulador y nueva_línea.

Tenga cuidado cuando utilice estos trucos en el intérprete de órdenes. Cuando el intérprete de órdenes trabaje en algunas partes de un archivo de órdenes y su entrada pueden ocurrir cosas extrañas.

    $ IFS=":,"                        # use ":" and "," as IFS
    $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
    IFS=  , IFS=:,
    $ date -R                         # just a command output
    Sat, 23 Aug 2003 08:30:15 +0200
    $ echo $(date -R)                 # sub shell --> input to main shell
    Sat  23 Aug 2003 08 30 36 +0200
    $ unset IFS                       # reset IFS to the default
    $ echo $(date -R)
    Sat, 23 Aug 2003 08:30:50 +0200

### 1.6.6. Fragmentos de órdenes utilizados con tuberías

Los fragmentos de órdenes siguientes son muy potentes cuando forman parte de una cadena de órdenes unidas por tuberías.

Tabla 1.27. Relación de fragmentos de órdenes con tuberías

fragmento de archivo de órdenes (escrito en una única línea) | efecto de la orden
--- | ---
`find /usr -print` | lista todos los archivos que se encuentran por debajo de «`/usr`»
`seq 1 100` | escribe del 1 al 100
`| xargs -n 1 command` | ejecuta la orden de forma repetida para cada elemento de la tubería y utilizando este como argumento
`| xargs -n 1 echo` | divide los elementos de la tubería separados por espacios en líneas
`| xargs echo` | une todas la líneas de la tubería en una
`| grep -e regex_pattern` | selecciona las líneas de la tubería que encajan con el patrón_de_expresión_regular
`| grep -v -e regex_pattern` | selecciona las líneas de la tubería que no tienen encaje con el patrón_de_la_expresión_regular
`| cut -d: -f3 -` | selecciona el tercer campo de cada línea de la tubería utilizando como separado «`:`» (archivo de contraseñas etc.)
`| awk '{ print $3 }'` | selecciona el tercer campo de cada línea de la tubería utilizando como separador espacios en blanco
`| awk -F'\t' '{ print $3 }'` | selecciona el tercer campo de cada línea de la tubería utilizando como separador el tabulador
`| col -bx` | elimina los retornos de carro y sustituye los tabuladores por espacios
`| expand -` | sustituye los tabuladores por espacios
`| sort| uniq` | ordena y elimina duplicados
`| tr 'A-Z' 'a-z'` | convierte mayúsculas a minúsculas
`| tr -d '\n'` | concatena las líneas en una sola
`| 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 -` | imprimir las primeras dos líneas
`| tail -n 2 -` | imprime las últimas dos líneas

Un archivo de órdenes de una sola línea puede repetirse sobre varios archivos utilizando find(1) y xargs(1) para realizar tareas muy complicadas. Ver Sección 10.1.5, “Formas de selección de archivos” y Sección 9.4.9, “Repetición de una orden sobre archivos”.

Cuando la utilización de órdenes de forma interactiva se complica demasiado debe considerarse escribir un archivo de órdenes (ver Sección 12.1, “Los archivos de órdenes”).

[1] Incluso el antiguo `vim` puede comenzar en el sano modo "`incompatible`" al iniciarlo con la opción "`-N`".

Prefacio |  | Capítulo 2. Gestión de paquetes Debian