Capítulo 1. Conceptos esenciales

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

¿Qué es Linux?

Linux es un sistema operativo (SO) gratuito y de código abierto que constituye una alternativa a Microsoft Windows y Apple macOS. Linux alimenta la mayoría de los servidores de Internet. Funciona entre bastidores en todos los teléfonos móviles Android y Chromebooks, y en millones de dispositivos conectados a la red como routers, cortafuegos y sistemas robóticos de ordeño de vacas (en serio). También funciona perfectamente en ordenadores de sobremesa y portátiles.

Linux tiene cuatro partes principales, que se muestran en la Figura 1-1:

El núcleo

Software de bajo nivel. Controla el hardware y funciones básicas como la programación de procesos y la conexión en red. Pocos usuarios interactúan directamente con el núcleo.

Programas suministrados

Miles de programas para el manejo de archivos, edición de texto, desarrollo de software, navegación web, audio, vídeo, encriptación, matemáticas... lo que se te ocurra. Estos programas hablan con el núcleo. Los programas que se ejecutan en la línea de comandos se denominan comandos.

La cáscara

Un programa de Linux para ejecutar comandos y mostrar los resultados. Linux tiene un surtido de shells con diferentes características. Este libro se centra en un shell llamado bash, que suele ser el predeterminado para las cuentas de usuario. Otros shells son dash, fish, ksh (Korn shell), tcsh (TC shell, o T shell), zsh (Z shell) y, en menor medida, busybox. Todos los shells tienen funciones similares, aunque su uso varía.

Entorno gráfico de escritorio (opcional)

Una interfaz de usuario con ventanas, menús, iconos, soporte para el ratón y otros elementos GUI familiares. Algunos entornos populares son GNOME y KDE Plasma. La mayoría de las aplicaciones creadas para GNOME pueden ejecutarse en KDE y vice versa.1

Este libro se centra en las partes de Linux relacionadas con la línea de comandos, es decir, los programas suministrados y el shell. Windows y macOS también tienen interfaces de línea de comandos (cmd y powershell en Windows, Terminal en el Mac), pero la mayoría de sus usuarios se quedan con la GUI y puede que nunca vean o necesiten una línea de comandos. En Linux, el shell es fundamental. Si utilizas Linux sin el intérprete de comandos, te lo estás perdiendo.

Linux es extremadamente configurable y se presenta en cientos de variedades que responden a diferentes necesidades y gustos. Cada variedad se denominadistro (abreviatura de "distribución"). Todas las distribuciones comparten algunos componentes básicos, pero pueden tener un aspecto diferente e incluir programas y archivos distintos. Algunas distros populares son Mint, Ubuntu, Manjaro, Arch, Gentoo, Red Hat y OpenSUSE, entre otras. El material básico de este libro debería aplicarse a todas las distribuciones.

The four major parts of Linux, conceptually. Low-level kernel functions are called by programs, which are invoked in a shell, which can be launched by a graphical desktop.
Figura 1-1. Las cuatro partes principales de Linux, conceptualmente. Las funciones de bajo nivel del núcleo son llamadas por los programas, que son invocados en un intérprete de comandos, que puede ser lanzado por un escritorio gráfico.

Iniciar un intérprete de comandos

¿De dónde salen los shells? A veces Linux lanzará una por ti automáticamente. Esto suele ocurrir cuando te conectas a través de una red utilizando ssh o una herramienta similar.Lo primero que verás es un intérprete de comandos esperando tu orden.

Otras veces, tienes que lanzar un intérprete de comandos manualmente. Esto es habitual cuando se utiliza un escritorio gráfico lleno de iconos y menús sin shell a la vista. En estos casos, necesitas una aplicación GUI llamada terminalo programa terminal que ejecuta shells en una ventana. La barra lateral"Shell Versus Terminal" aclara la diferencia entre shells y terminales.

Todas las distribuciones con escritorio gráfico incluyen al menos un programa de terminal, pero puede que tengas que buscarlo. Busca una aplicación, icono o elemento de menú llamado Terminal, Konsole,xterm, gnome-terminal,uxterm, o algo similar, y ejecútalo para abrir un terminal. Prueba también a pulsar Ctrl-Alt-t (mantén pulsadas las teclas Control y Alt y pulsa T), que abre un terminal en algunos entornos.

Calentamiento de la línea de comandos

Para que te dé una idea de Linux, aquí tienes 10 comandos sencillos que puedes probar ahora mismo en un intérprete de comandos. Escríbelos exactamente, incluyendo mayúsculas y minúsculas, espacios y todos los símbolos después del prompt. Al final de cada comando, pulsa Intro.2

Muestra un calendario de noviembre de 2023:

cal nov 2023
   November 2023
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

Lista el contenido del directorio /bin, que contiene muchos comandos:

ls /bin
bash      less        rm
bunzip2   lessecho    rmdir
busybox   lessfile    rnano
⋮

Cuenta el número de elementos visibles en tu directorio personal (representado aquí por una variable, HOME, de la que hablaré más adelante):

ls $HOME | wc -l
8                     Your value may be different

Ver cuánto espacio se utiliza en una partición de tu disco duro:

df -h /
Filesystem  Size  Used Avail Use% Mounted on
/dev/sdb1    78G   30G   48G  61% /

Observa los procesos que se ejecutan en tu ordenador (pulsa "q" para salir):

top -d1

Imprime el archivo /etc/hosts, que contiene los nombres y direcciones de los ordenadores, en tu impresora predeterminada, si tienes una configurada:

lpr /etc/hosts

Ver cuánto tiempo llevas conectado:

last -1 $USER
smith  pts/7 :0  Tue Nov 10 20:12  still logged in

Descarga un archivo sample.pdf del sitio web de este libro a tu directorio actual, sin necesidad de un navegador web:

curl -O https://linuxpocketguide.com/sample.pdf

Comprueba quién es el propietario del nombre de dominio oreilly.com (pulsa la barra espaciadora para avanzar página a página, y pulsa "q" para salir):

whois oreilly.com | less
Domain Name: OREILLY.COM
Registrar: GODADDY.COM, LLC
⋮

Por último, borra tu terminal o pantalla:

clear

¡Enhorabuena, ya eres usuario de Linux !

La estructura de los comandos

Un comando de Linux suele constar de un nombre de programaseguido de las opciones y losargumentos:

wc -l myfile

El nombre del programa (wc, abreviatura de "recuento de palabras") se refiere a un programa en algún lugar del disco que el shell localiza y ejecuta. Las opciones, que suelen empezar por un guión, afectan al comportamiento del programa. En el comando anterior, la opción -l indica a wc que cuente líneas y no palabras. El argumento myfile especifica el archivo que wc debe leer y procesar.

Los comandos pueden tener varias opciones y argumentos. Las opciones pueden darse individualmente, o combinadas después de un guión:

wc -l -w myfile           Two individual options
wc -lw myfile             Combined options, same as -l -w

aunque algunos programas son extravagantes y no reconocen las opciones combinadas. Los argumentos múltiples también están bien:

wc -l myfile myfile2      Count lines in two files

Las opciones no están estandarizadas. Pueden ser un guión simple y un carácter (por ejemplo, -l), dos guiones y una palabra (--lines), o varios formatos más. La misma opción puede tener significados diferentes para programas distintos: en el comando wc -l, la opción -l significa "líneas de texto", pero en ls -l significa "salida larga". Dos programas también pueden utilizar opciones diferentes para significar lo mismo, como -qpara "ejecutar en silencio" frente a -s para "ejecutar silenciosamente". Algunas opciones van seguidas de un valor, como -s 10, y el espacio entre ellas puede no ser necesario (-s10).

Los argumentos suelen ser nombres de archivos de entrada o salida, pero también pueden ser otras cosas, como nombres de directorio, nombres de usuario, nombres de host, direcciones IP, expresiones regulares o cadenas arbitrarias.

Un comando que es sólo un programa con opciones y argumentos se llama comando simple.He aquí un comando simple que enumera los usuarios que han iniciado sesión en un servidor Linux:3

who
silver       :0    Sep 23 20:44
byrnes    pts/0    Sep 15 13:51
barrett   pts/1    Sep 22 21:15
silver    pts/2    Sep 22 21:18

Un comando también puede invocar varios programas a la vez e incluso conectar programas para que interactúen. Aquí tienes un comando que conecta la salida de who con la entrada de wc, que cuenta líneas de texto. El resultado es el número de líneas en la salida de who:

who | wc -l
4

La barra vertical, llamada tubería, hace la conexión entre who y wc. Los expertos en Linux utilizan este tipo de comandos combinados, llamados pipelines, todo el tiempo.

Los comandos también pueden incluir construcciones del lenguaje de programación como variables, condicionales y bucles, que cubro en"Programación con scripts de shell". Por ejemplo, un comando podría decir: "ejecuta este programa, escribe su salida en un archivo de mi elección y, si se produce algún error, envíame un correo electrónico con los resultados a ".

Usuarios y superusuarios

Linux es un SO multiusuario: varias personas pueden ejecutar programas en un mismo ordenador Linux al mismo tiempo. En un ordenador determinado, cada usuario se identifica por un nombre de usuario, como smith ofunkydance. Cada usuario tiene una especie de espacio de trabajo independiente (ver"Directorios de inicio") para que no interfieran unos con otros.

Un usuario especial llamado root -el superusuario o administrador- tieneprivilegios para hacer cualquier cosa en el sistema. El superusuario puede crear, modificar o eliminar cualquier archivo y ejecutar cualquier programa. Los usuarios normales están restringidos: pueden ejecutar la mayoría de los programas, pero en general, no pueden meterse con las cosas de otros usuarios.

Algunos comandos de este libro requieren privilegios de superusuario. Precedo estos comandos con sudo:

sudo superuser command goes here
Advertencia

sudo te da el poder de destruir tu sistema Linux.

Hablaré de sudo en profundidad en "Convertirse en superusuario", pero por ahora, todo lo que necesitas saber es que sudo te da poderes de superusuario y a veces te pide tu contraseña. Por ejemplo, para contar las líneas de un archivo protegido llamado /etc/shadow, con y sin sudo, podrías ejecutar este comando:

wc -l /etc/shadow                 This fails
wc: /etc/shadow: Permission denied
→ sudo wc -l /etc/shadow            Run with sudo
[sudo] password: xxxxxxxx
51 /etc/shadow                      It worked!

El sistema de archivos

Para hacer uso de cualquier sistema Linux, debes sentirte cómodo con los archivos y directorios de Linux (también conocidos como carpetas),denominados colectivamente sistema de archivos. En un escritorio gráfico, los archivos y directorios son obvios en la pantalla. En una interfaz de línea de comandos como el shell de Linux, los mismos archivos y directorios siguen estando presentes pero son menos visibles, por lo que a veces deberás recordar en qué directorio estás "dentro" y cómo se relaciona con otros directorios. Utilizarás comandos del shell como cd (cambiar directorio) para moverte entre directorios, y comandos comopwd (imprimir directorio de trabajo) para saber en qué parte del sistema de archivos te encuentras.

Veamos algo de terminología. Los archivos de Linux se agrupan endirectorios. Los directorios forman una jerarquía, o árbol, como en la Figura 1-3. Un directorio puede contener otros directorios, llamadossubdirectorios, que a su vez pueden contener otros archivos y subdirectorios, y así hasta el infinito. El directorio superior se denomina directorio raíz y se indica con una barra (/).4

A Linux filesystem (partial). The root directory is at the top. The absolute path to the 'dan' directory is /home/dan.
Figura 1-3. Un sistema de archivos Linux (parcial). El directorio raíz está en la parte superior. La ruta absoluta al directorio "dan" es /home/dan.

Linux se refiere a sus archivos y directorios utilizando una sintaxis de "nombres y barras" llamada ruta. Por ejemplo, la siguiente ruta:

/one/two/three/four

se refiere al directorio raíz /, que contiene un directorio llamadouno, que contiene un directorio dos, que contiene un directoriotres, que contiene un archivo o directorio final, cuatro. Cualquier ruta que empiece por una barra, que descienda desde la raíz, se denomina ruta absoluta.

Las rutas no tienen por qué ser absolutas: pueden ser relativas a algún directorio distinto del raíz. La Figura 1-3 tiene dos directorios diferentes llamados bin, cuyas rutas absolutas son /biny /usr/bin. Si te refieres simplemente al "directorio bin ", no queda claro a cuál te refieres. Necesitas más contexto. Cualquier ruta que no empiece por una barra, como bin, se denomina ruta relativa.

Para dar sentido a una ruta relativa, necesitas saber "dónde estás" en el sistema de archivos de Linux. Esta ubicación se denomina tu directorio actual (a veces llamado "directorio de trabajo" o "directorio de trabajo actual").

Cada shell tiene un directorio actual, y cuando ejecutas comandos en ese shell, éstos operan de forma relativa a su directorio actual. Por ejemplo, si tu shell está "en" el directorio /usr, y te refieres a una ruta relativa bin, significa /usr/bin. En general, si tu directorio actual es /uno/dos/tres, una ruta relativa a/b/c implicaría la ruta absoluta /uno/dos/tres/a/b/c.

Hay dos rutas relativas especiales denominadas . (un solo punto, o "punto") y .. (dos puntos, o "punto punto"). "Punto" significa el directorio actual de tu shell, y "punto punto" significa su directorio padre, un nivel por encima. Así, si el directorio actual de tu shell es /uno/dos/tres, entonces . se refiere a este directorio y .. se refiere a /uno/dos.

Para viajar de un directorio a otro, utiliza el comando cd, que cambia el directorio actual de tu shell:

cd /usr/local/bin       Enter the directory /usr/local/bin

El comando anterior cd utilizaba una ruta absoluta. También puedes hacer movimientos relativos con cd:

cd d           Enter subdirectory d of my current directorycd ../mydir    Go up to my parent, then into directory mydir

Los nombres de archivos y directorios pueden contener la mayoría de los caracteres que esperas: mayúsculas y minúsculas,5 números, puntos, guiones, guiones bajos y la mayoría de los símbolos (pero no "/", que está reservado para separar directorios). Por eficiencia, sin embargo, evita los espacios, asteriscos, signos de dólar, paréntesis y otros caracteres que tengan un significado especial para el shell. Estos caracteres requieren un tratamiento especial en los nombres de archivo (ver "Citando"), lo que puede resultar incómodo o tedioso.

Inicio Directorios

Los archivos personales de los usuarios de suelen guardarse en el directorio/home (para usuarios normales) o /root (para el superusuario). Tu directorio personal suele ser/home/<tu-nombre-de-usuario>(/home/smith, /home/funkydance, etc.). Hay varias formas de visitar o hacer referencia a tu directorio personal:

cd

Sin argumentos, el comando cd te devuelve (es decir, establece el directorio actual del intérprete de comandos) a tu directorio personal.

HOME variable

La variable de entorno HOME (ver "Variables Shell") contiene el nombre de tu directorio personal:

echo $HOME                 Print the directory name
/home/smith
→ cd $HOME/linuxpocketguide  Visit a subdirectory
~

Cuando se utiliza en lugar de un directorio, el intérprete de comandos expande la tilde solitaria al nombre de tu directorio personal.

echo ~                  Print the directory name
/home/smith
→ cd ~/linuxpocketguide   Visit a subdirectory

Cuando la tilde va seguida de un nombre de usuario (como en ~fred), el intérprete de comandos expande esta cadena para que sea el directorio home del usuario:

cd ~fred       Visit Fred's home directory, if it existspwd            The “print working directory” command
/home/fred

Directorios del sistema

Un sistema Linux tiene decenas de miles de directorios de sistema. Contienen archivos del SO, aplicaciones, documentación y casi todo excepto archivos personales de usuario (que suelen vivir en/home).

A menos que seas administrador del sistema, rara vez visitarás la mayoría de los directorios del sistema, pero con un poco de conocimiento podrás entender o adivinar sus propósitos. Sus nombres suelen contener tres partes, como se muestra en laFigura 1-4.

Directory scope, category, and application
Figura 1-4. Alcance, categoría y aplicación del directorio

Ruta del directorio parte 1: ámbito

El ámbito de una ruta de directorio describe, a alto nivel, la finalidad de todo un árbol de directorios. Algunos comunes son

/

(Se pronuncia "root") Archivos del sistema suministrados con tu distro

/usr

(Se pronuncia "usuario") Más archivos de sistema suministrados con tu distro

/usr/local

(Se pronuncia "local de usuario") Archivos del sistema que no se suministran con tu distro; pueden ser exclusivos de tu red Linux local o de tu ordenador individual

En la práctica no hay una distinción clara entre / y /usr, pero / se considera de "nivel inferior" y más cercano al SO.

Ruta del directorio parte 2: categoría

La categoría de una ruta de directorio en la Figura 1-4describe los tipos de archivos que se encuentran en un directorio. Por ejemplo, si la categoría es lib, puedes estar razonablemente seguro de que el directorio contiene archivos de bibliotecapara programar. Si la categoría es bin, el contenido suelen ser archivos binarios: programas ejecutables.

Cuando precedes una categoría como bin con un ámbito, produces rutas como /bin, /usr/bin y /usr/local/bin. Los programas de sistema más fundamentales de una distro, como ls y cat, suelen estar en/bin, y otros programas de sistema están en/usr/bin.6 /usr/local/bin contiene programas instalados localmente no incluidos en tu distro. No se trata de reglas rígidas, sino de casos típicos.

Algunas categorías comunes son las siguientes:

Categorías de programas

papelera

Programas (normalmente archivos binarios)

sbin

Programas (normalmente archivos binarios) para superusuarios

lib

Bibliotecas de código utilizadas por los programas

Categorías de documentación

doc

Documentación

información

Archivos de documentación para el sistema de ayuda integrado de emacs

hombre

Archivos de documentación (páginas de manual) mostrados por el comando man; los archivos suelen estar comprimidos y salpicados de comandos de composición tipográfica para que man los interprete.

comparte

Archivos específicos del programa, como ejemplos e instrucciones de instalación

Categorías de configuración

etc

Archivos de configuración del sistema (y otras cosas varias)

init.d

Ficheros de configuración para arrancar Linux

rc.d

Ficheros de configuración para arrancar Linux; también rc1.d, rc2.d, ...

Categorías de programación

incluye

Ficheros de cabecera para programar

src

Código fuente de los programas

Categorías de archivos web

cgi-bin

Scripts/programas que se ejecutan en páginas web

html

Páginas web

public_html

Páginas web, normalmente en los directorios personales de los usuarios

www

Páginas web

Categorías para exponer

fuentes

Fuentes (¡sorpresa!)

X11

Archivos del sistema de ventanas X

Categorías de hardware

dev

Archivos de dispositivo para interactuar con discos y otro hardware

medios de comunicación

Puntos de montaje: directorios que dan acceso a los discos

mnt

Puntos de montaje: directorios que dan acceso a los discos

Categorías de archivos de tiempo de ejecución

var

Archivos relacionados con el estado del ordenador, actualizados con frecuencia

bloquear

Archivos de bloqueo, creados por los programas para decir "estoy en ejecución"; la existencia de un archivo de bloqueo puede impedir que otro programa, u otra instancia del mismo programa, realice una acción

registro

Archivos de registro que rastrean eventos importantes del sistema, conteniendo mensajes de error, advertencia e informativos.

correo

Buzones para el correo electrónico entrante

ejecuta

Archivos PID, que contienen los ID de los procesos en ejecución; estos archivos se consultan a menudo para rastrear o matar procesos concretos

carrete

Archivos en cola o en tránsito, como correo electrónico saliente, trabajos de impresión y trabajos programados

tmp

Almacenamiento temporal para programas y/o personas a utilizar

Ruta del directorio parte 3: aplicación

La parte de aplicación de una ruta de directorio(Figura 1-4), si está presente, suele ser el nombre de un programa. Por ejemplo, el directorio/etc/systemd tiene ámbito root (/), categoría etc (archivos de configuración) y aplicación systemd. Dado que systemd es un servicio para configurar máquinas Linux, una buena suposición es que /etc/systemdcontiene archivos de configuración para ese servicio, y los tiene.

Directorios relacionados con el núcleo

Algunos directorios de son compatibles con el núcleo Linux, la parte de más bajo nivel del SO Linux:

/arranque

Archivos para arrancar el sistema. El núcleo vive aquí, normalmente en /boot/vmlinuz o en un archivo de nombre similar.

/perdido+encontrado

Archivos dañados que fueron rescatados por una herramienta de recuperación de disco.

/proc

Ficheros de procesos en ejecución; para usuarios avanzados.

/sys

Archivos para el funcionamiento interno del núcleo; para usuarios avanzados.

Los archivos en /proc y /sys proporcionan vistas del núcleo en ejecución y tienen propiedades especiales. Los archivos en /proc siempre parecen ser de tamaño cero, de sólo lectura y con fecha actual, pero su contenido contiene mágicamente información sobre el núcleo Linux:

ls -lG /proc/version
-r--r--r--  1 root  0 Oct  3 22:55 /proc/version
→ cat /proc/version
Linux version 5.15.0-76-generic ...

Los archivos de /sys también tienen tamaños engañosos y contenidos mágicos:

ls -lG /sys/power/state
-rw-r--r-- 1 root 4096 Jul  8 06:12 /sys/power/state
→ cat /sys/power/state
freeze mem disk

/proc y /sys los utilizan sobre todo los programas del sistema, pero no dudes en consultarlos. Aquí tienes algunos ejemplos:

/proc/ioports

Una lista del hardware de entrada/salida de tu ordenador.

/proc/cpuinfo

Información sobre los procesadores de tu ordenador.

/proc/versión

La versión del sistema operativo. El comando uname imprime la misma información.

/proc/tiempo de actividad

Tiempo de actividad del sistema: segundos transcurridos desde el último arranque del sistema. Ejecuta uptime para obtener un resultado más legible.

/proc/NNN

Información sobre el proceso Linux con ID NNN, donde NNN es un número entero positivo, como /proc/13542.

/proc/self

Información sobre el proceso actual que estás ejecutando; un enlace simbólico a un archivo /proc/nnn, actualizado automáticamente. Prueba a ejecutarlo:

ls -l /proc/self

varias veces seguidas, y /proc/self cambia donde puntos.

Permisos de archivos

Un sistema Linux puede tener muchas cuentas de usuario. Para mantener la privacidad y la seguridad, la mayoría de los usuarios sólo pueden acceder a algunos archivos del sistema, no a todos. Este control de acceso se concreta en dos preguntas:

¿Quién tiene permiso?

Cada archivo y directorio tiene unpropietario que puede hacer lo que quiera con él. Normalmente, el propietario de un archivo es el usuario que lo creó. Un superusuario puede cambiar el propietario de un archivo.

Además, un grupo predefinido de usuarios puede acceder a un archivo. Los grupos los define el administrador del sistema y los trataré en "Gestión de grupos".

Por último, un archivo o directorio puede abrirse a todos los usuarios que tengan cuentas en el sistema. También verás que a este conjunto de usuarios se le llama el mundo o simplemente otros.

¿Qué tipo de permiso se concede?

Los propietarios de archivos, los grupos y el mundo pueden tener permisos paraleer, escribir (modificar) y ejecutar (ejecutar) determinados archivos. Los permisos también se extienden a los directorios, que los usuarios pueden leer (ver archivos dentro del directorio), escribir (crear y eliminar archivos dentro del directorio) y ejecutar (entrar en el directorio con cd).

Para ver la propiedad y los permisos de un archivo llamado miarchivo, ejecuta ls -l, descrito en"Operaciones básicas con archivos":

ls -l myfile
-rw-r--r-- 1 smith smith  1168 Oct 28  2015 myfile

Para ver la propiedad y los permisos de un directorio llamado mydir, añade la opción -d:

ls -ld mydir
drwxr-x--- 3 smith smith  4096 Jan 08 15:02 mydir

En la salida, los permisos del archivo son los 10 caracteres situados más a la izquierda, una cadena de r (lectura), w (escritura), x (ejecución), otras letras y guiones. Por ejemplo:

-rwxr-x---

He aquí lo que significan estas letras y símbolos, brevemente:

Posición Significado

1

Tipo de archivo: - = archivo, d = directorio, l = enlace simbólico, p = tubería con nombre, c = dispositivo de caracteres, b = dispositivo de bloques

2-4

Permisos para el propietario del archivo: lectura (r), escritura (w), ejecución (x), o sin permiso (-).

5-7

Permisos para el grupo del archivo: r, w, x, -

8-10

Permisos para el resto de usuarios: r, w, x, -

Mi ejemplo -rwxr-x--- significa un archivo que puede ser leído, escrito y ejecutado por el propietario; leído y ejecutado por el grupo, pero no escrito; y al que los demás usuarios no pueden acceder en absoluto. Para cambiar el propietario, el grupo o los permisos, utiliza los comandos chown,chgrp , y chmod,respectivamente, como describe en "Propiedades de los archivos".

Características seleccionadas de Bash

Un shell hace mucho más que simplemente ejecutar comandos. También simplificala ejecución de comandos, gracias a potentes funciones: coincidencia de patrones para nombres de archivo, un "historial de comandos" para recordar rápidamente comandos anteriores, tuberías para enviar la salida de un comando a la entrada de otro, variables para almacenar valores para su uso por el intérprete de comandos, y mucho más. Tómate tu tiempo para aprender estas funciones y serás más rápido y productivo con Linux.7 Vamos a rozar la superficie y a presentarte estas útiles herramientas. (Para obtener la documentación completa, ejecuta info bash.)

¿Qué Shell utilizas?

Este libro de asume que tu shell es bash. Para identificar tu shell, ejecuta

echo $SHELL
/bin/bash

Si tu intérprete de comandos no es bash y quieres probarlo, ejecuta directamente el comandobash, porque bash, como todos los intérpretes de comandos, es sólo un programa. (Se encuentra en/bin/bash.)

bash

Ejecuta el comando exit cuando hayas terminado para volver a tu shell habitual. Para cambiar tu shell por defecto a bash, consulta el comando chsh en "Gestión de cuentas de usuario".

Coincidencia de patrones

Los patrones que coinciden con en el shell, a veces llamados comodines, son una forma abreviada de trabajar con conjuntos de archivos. Por ejemplo, el patrón a* se refiere a los archivos cuyos nombres empiezan por "a" minúscula. El shell expande un patrón en el conjunto completo de nombres de archivo con los que coincide. Si ejecutas

ls a* 
aardvark  adamantium  apple

el intérprete de comandos expande de forma invisible el patrón a* en los nombres de archivo que empiezan por "a" en tu directorio actual, como si lo hubieras escrito:

ls aardvark adamantium apple

ls nunca sabe que has utilizado un patrón: sólo ve la lista final de nombres de archivo tras la expansión. Esto significa que todos los programas Linux que lances desde un shell, independientemente de su origen, "funcionan" con patrones y otras funciones del shell. Este es un punto de vital importancia. Un número sorprendente de usuarios de Linux piensan que los programas expanden sus propios patrones de archivos en la línea de comandos. No es así. El shell lo haceantes incluso de que se ejecute el programa asociado.

Los patrones nunca coinciden con dos caracteres especiales: un punto inicial y la barra de directorio (/). Un patrón como .bas* coincide con .bashrc, y /etc/*conf coincide con todos los nombres de archivo que terminen en conf en el directorio /etc.

Patrón Significado

*

Cero o más caracteres consecutivos, excepto un punto inicial o una barra de directorio.

?

Cualquier carácter, excepto un punto inicial o una barra de directorio.

[configura]

Cualquier carácter individual del conjunto dado. Puede ser una secuencia de caracteres, como [aeiouAEIOU] para todas las vocales, o un rango con un guión, como [A-Z] para todas las mayúsculas, o una combinación.

[!configura]

Cualquier carácter que no esté en el conjunto dado, como [!0-9] para significar cualquier no dígito.

[^configura]

Igual que [!set].

Para que coincida con un guión literal en un conjunto de caracteres, ponlo primero o último para que no forme parte de un rango. Para incluir un corchete de cierre literal en el conjunto, colócalo primero en el conjunto, o escápalo con una barra invertida (\]). Para incluir un símbolo ^ o ! literalmente, colócalo en otro lugar que no sea el primero del conjunto, o escápalo .

Ampliación del corsé

Similar a los patrones de archivo, las expresiones con llaves también se expanden para convertirse en múltiples argumentos de un comando. La expresión separada por comas:

{bubble,quick,merge}

se expande primero a bubble, luego a quick, y finalmente a merge dentro de una línea de comandos, así:

echo {bubble,quick,merge}sort.java
bubblesort.java quicksort.java mergesort.java
Nota

La diferencia clave entre llaves y corchetes es que las llaves funcionan con cualquier cadena, mientras que las expresiones de corchetes sólo coinciden con los nombres de archivo existentes en .

Las llaves también pueden expandirse a una secuencia de valores en un rango, si separas los puntos finales del rango con dos puntos (..):

echo {3..12}
3 4 5 6 7 8 9 10 11 12
→ echo {A..E}
A B C D E
→ echo file{1..5}.py
file1.py file2.py file3.py file4.py file5.py

Variables Shell

En puedes definir variables en un intérprete de comandos y asignarles valores:

MYVAR=3      Assign the value 3 to variable MYVAR

Para hacer referencia a un valor, basta con poner un signo de dólar delante del nombre de la variable:

echo $MYVAR
3

El shell define algunas variables estándar cuando te conectas:

Variable Significado

DISPLAY

El nombre de la pantalla de tu ventana X

HOME

Tu directorio personal, como /home/smith

LOGNAME

Tu nombre de usuario, por ejemplo smith

MAIL

Tu buzón de entrada, como /var/spool/mail/smith

OLDPWD

El directorio anterior de tu shell, antes del último comando cd

PATH

Tu ruta de búsqueda en el shell: directorios separados por dos puntos

PWD

El directorio actual de tu shell

SHELL

La ruta a tu shell (por ejemplo, /bin/bash)

TERM

El tipo de tu terminal (por ejemplo, xterm o vt100)

USER

Tu nombre de usuario

Las variables y sus valores están limitados, por defecto, al shell que las define. Para que una variable y su valor estén disponibles para otros programas que invoque tu shell (es decir, subprocesos), utiliza el comando export:

MYVAR=3export MYVAR

o la taquigrafía:

export MYVAR=3

Tu variable exportada se llama ahora variable de entorno. Para ir más allá y hacer que una variable esté disponible para cada nuevo intérprete de comandos que ejecutes, no sólo para los subprocesos de tu intérprete de comandos actual, coloca previamente la definición de la variable en un archivo de configuración del intérprete de comandos; consulta "Adaptar el comportamiento del intérprete de comandos".

Para listar las variables de entorno de un intérprete de comandos, ejecuta

printenv

Para establecer una variable de entorno sólo para la duración de un comando, anteponeel valor de la variable= a la línea del comando:

printenv HOME
/home/smith
→ HOME=/home/sally printenv HOME
/home/sally
→ printenv HOME
/home/smith            The original value is unaffected

Ruta de búsqueda

Los programas pueden estar dispersos por todo el sistema de archivos de Linux, principalmente en directorios como /bin y/usr/bin. Cuando ejecutas un comando que invoca un programa, de alguna manera el intérprete de comandos debe localizar el programa en el sistema de archivos:

who         The shell must locate the “who” program to run it

El intérprete de comandos encuentra el programa consultando el valor de la variable de entorno PATH , que es una lista de directorios separados por dos puntos. Esta lista se denomina ruta de búsqueda del intérprete de comandos.

echo $PATH
/usr/local/bin:/bin:/usr/bin    Search path with 3 directories

El intérprete de comandos busca un archivo ejecutable llamado who en cada directorio de la lista en secuencia. Si localiza who (por ejemplo, en /usr/bin/who), ejecuta el programa y también almacena en caché la ubicación para la próxima vez (ejecuta hash --help para obtener más información sobre el almacenamiento en caché). En caso contrario, informa de un fallo:

bash: who: command not found

Para imprimir la ubicación de un comando en la ruta de búsqueda, ejecuta el comandotype o which:

type who                     The output may vary:
who is hashed (/usr/bin/who)   This means "who" is cached
who is /usr/bin/who            This means "who" isn't cachedwhich who
/usr/bin/who

Para añadir directorios a la ruta de búsqueda de tu intérprete de comandos temporalmente, modifica su variablePATH. Por ejemplo, añade /usr/sbin a la ruta de búsqueda de tu intérprete de comandos:

PATH=$PATH:/usr/sbinecho $PATH
/usr/local/bin:/bin:/usr/bin:/usr/sbin

Este cambio sólo afecta al shell actual. Para que se mantenga, modificaPATH en un archivo de configuración de bash, como se explica en"Adaptar el comportamiento del shell". A continuación, cierra la sesión y vuelve a iniciarla, o ejecuta a mano el archivo de configuración en cada ventana de shell abierta. Por ejemplo

. $HOME/.bashrc    If you modified $HOME/.bashrc

Alias

El comando alias define una abreviatura conveniente para otro comando. Por ejemplo, este alias:

alias ll='ls -lG'

define un nuevo comando ll que ejecuta ls -lG:

ll
total 436
-rw-r--r--    1 smith     3584 Oct 11 14:59 file1
-rwxr-xr-x    1 smith       72 Aug  6 23:04 file2
⋮

Define alias en tu archivo ~/.bashrc (consulta "Adaptar el comportamiento del shell") para que estén disponibles en futuros shells.8 Para listar todos tus alias, ejecutaalias. Si quieres más flexibilidad de la que proporcionan los alias, consulta"Programación con scripts de shell", ejecuta info bash, y lee sobre "funciones de shell".

Comandos integrados

La mayoría de los comandos de Linux son programas del sistema de archivos de Linux. Algunos ejemplos sonwc y who, que suelen estar en el directorio /usr/bin. El shell los localiza y ejecuta utilizando la variable PATH, como he descrito en "Ruta de búsqueda". Algunos otros comandos, sin embargo, son características incorporadas del shell, conocidas como comandos integrados. Has visto varios comandos incorporados en este capítulo, como cd, alias y export. Para determinar si un comando está en el sistema de archivos, es un comando incorporado o un alias, ejecuta el comando type:

type wc cd ll             Print the types of these commands
wc is /usr/bin/wc           A program in the filesystem
cd is a shell builtin       A built-in shell command
ll is aliased to `ls -lG'   An alias

Entrada, salida y redirección

La mayoría de los comandos de Linux aceptan entrada y/o producen salida. La entrada del teclado se denomina entrada estándar o stdin. La salida a tu pantalla se denomina salida estándar o stdout. Los mensajes de error se tratan de forma especial y se imprimen en el error estándar ostderr, que también suele ser tu pantalla, pero Linux separa internamente stderr de stdout.9

El shell puede redirigir la entrada estándar, la salida estándar y el error estándar a y desde archivos. En otras palabras, cualquier comando que lea de la entrada estándar puede hacer que su entrada provenga de un archivo con el operador < del intérprete de comandos:

command < infile

Del mismo modo, cualquier comando que escriba en la salida estándar puede escribir en un archivo en su lugar:

command > outfile      Create/overwrite outfilecommand >> outfile     Append to outfile

Un comando que escriba en el error estándar también puede redirigir su salida de error a un archivo, sin que la salida estándar se vea afectada:

command 2> errorfile

Para redirigir tanto la salida estándar como el error estándar a los archivos :

command > outfile 2> errorfile  Separate filescommand &> outfile              Single file (preferred)command >& outfile              Single file (less common)

Comandos combinados

Bash te permite ir más allá de los comandos simples combinando varios programas en una sola línea de comandos.

Secuencias de comandos

Para invocar varios comandos en secuencia en una sola línea de comandos, sepáralos con punto y coma:

command1 ; command2 ; command3

Para ejecutar una secuencia de comandos como antes, pero detener la ejecución si falla alguno de ellos, sepáralos con símbolos && ("y"):

command1 && command2 && command3

Para ejecutar una secuencia de comandos, deteniendo la ejecución en cuanto uno tenga éxito, sepáralos con símbolos || ("o"):

command1 || command2 || command3

Tuberías

Puedes redirigir la salida estándar de un comando para que sea la entrada estándar de otro, utilizando el operador pipe (|) del shell. (En los teclados de EE.UU., encuentra este símbolo justo encima de la tecla Intro.) Por ejemplo, este comando:

who | sort

envía la salida de who al comando sort, imprimiendo una lista ordenada alfabéticamente de los usuarios conectados. Las tuberías múltiples también funcionan. Ordenemos de nuevo la salida de who, extraigamos la primera columna de información (utilizando awk), y mostremos los resultados página a página (utilizando less):

who | sort | awk '{print $1}' | less

Sustitución de comandos

Si rodeas un comando con comillas ("backticks"), el shell elimina el comando y sustituye la salida del comando.

date +%Y                 Print the current year
2024
→ echo This year is `date +%Y`
This year is 2024

El signo del dólar y los paréntesis equivalen a las comillas inversas:

echo This year is $(date +%Y)
This year is 2024

pero son superiores porque pueden anidarse:

echo Next year is $(expr $(date +%Y) + 1)
Next year is 2025

Sustitución de procesos

Algunos programas no funcionan bien con tuberías porque no leen de la entrada estándar, sólo de archivos de disco. Un ejemplo es el comando diff que compara dos archivos línea por línea e imprime sus diferencias.La sustitución de procesos es una forma de forzar a un comando como diff a leer de la entrada estándar. Ejecuta un comando y deja que su salida se "disfrace" de archivo, que programas comodiff aceptarán encantados. Con el operador desustitución de procesos,<(), puedes comparar la salida de dos comandos en lugar de dos archivos de disco.

Supón que tienes un directorio lleno de archivos JPEG y de texto por parejas:

ls jpegexample
file1.jpg  file2.jpg  file3.jpg  ...
file1.txt  file2.txt  file3.txt  ...

y quieres confirmar que a cada archivo JPEG le corresponde un archivo de texto y viceversa. Normalmente, podrías crear dos archivos temporales, uno con los nombres de los archivos JPEG y otro con los nombres de los archivos de texto, eliminar las extensiones de los archivos con cut, y comparar los dos archivos temporales con diff:

cd jpegexamplels *.jpg | cut -d. -f1 > /tmp/jpegsls *.txt | cut -d. -f1 > /tmp/textsdiff /tmp/jpegs /tmp/texts
5a6
> file6       No file6.jpg was found
8d8
< file9       No file9.txt was found

La sustitución de procesos realiza la misma tarea con un solo comando y sin archivos temporales:

diff <(ls *.jpg|cut -d. -f1) <(ls *.txt|cut -d. -f1)

Cada operador <() sustituye a un nombre de archivo en la línea de comandos, como si ese "archivo" contuviera la salida de ls y cut.

Prevenir la evaluación

El intérprete de comandos evalúa cada carácter de un comando. Para evitar la evaluación, utiliza las comillas o el escape.

Citando a

Normalmente, el shell trata los espacios en blanco como separadores de cadenas en la línea de comandos. Para crear una cadena que contenga espacios en blanco (por ejemplo, un nombre de archivo con un espacio), rodéala de comillas simples o dobles, y el shell la tratará como una unidad. Las comillas simples tratan su contenido literalmente, mientras que las dobles permiten evaluar variables y otras construcciones del shell:

echo 'The variable HOME has value $HOME'
The variable HOME has value $HOME
→ echo "The variable HOME has value $HOME"
The variable HOME has value /home/smith

Escapar de

Si un carácter tiene un significado especial para el shell pero quieres que se utilice literalmente (por ejemplo, * como un asterisco literal en lugar de un patrón de archivo), precede al carácter con la barra invertida "\". Esto se llama escapar el carácter especial:

echo a*                    A file pattern
aardvark  adamantium  apple
→ echo a\*                   A literal asterisk
a*
→ echo "I live in $HOME"     Print a variable value
I live in /home/smith
→ echo "I live in \$HOME"    Print a literal dollar sign
I live in $HOME

También puedes escapar caracteres de control (tabuladores, nuevas líneas, ^D, etc.) para que se utilicen literalmente en la línea de comandos, si los precedes de^V. Esto es especialmente útil para los caracteres de tabulación, que el intérprete de comandos utilizaría de otro modo para completar el nombre de archivo (consulta"Completar nombre de archivo").

echo "There is a tab between here^V    and here"
There is a tab between here      and here

Edición desde la línea de comandos

Bash te permite editar la línea de comandos en la que estás trabajando, utilizando pulsaciones de teclas inspiradas en los editores de texto Emacs y Vim (consulta"Crear y editar archivos"). Para activar la edición de la línea de comandos con las teclas de Emacs, ejecuta este comando (y colócalo en un archivo de configuración de bash para que sea permanente):

set -o emacs

Para las teclas de vi (o Vim):

set -o vi
Tecla Emacs Pulsación de la tecla Vim (después de ESC) Significado

^P o flecha arriba

k o flecha arriba

Ir al comando anterior

^N o flecha abajo

j o flecha abajo

Ir al siguiente comando

^R

Buscar un comando anterior de forma interactiva

^F o flecha derecha

l o flecha derecha

Avanza un carácter

^B o flecha izquierda

h o flecha izquierda

Retroceder un carácter

^A

0

Ir al principio de la línea

^E

$

Ir al final de la línea

^D

x

Borrar el carácter siguiente

^U

^U

Borrar al principio de la línea

Historial de comandos

Un intérprete de comandos puede recordar comandos anteriores y volver a ejecutarlos, una función llamada historial de comandos. Prueba estos útiles comandos y expresiones relacionados con el historial:

Mando Significado

history

Imprime tu historial

history N

Imprime los N comandos más recientes de tu historial

history -c

Borrar (eliminar) tu historial

!!

Representa tu comando anterior. Para volver a ejecutarlo:

!! <Enter>

!N

Representa el comando número N de tu historial

!-N

Representa el comando que introdujiste hace N comandos

!$

Representa el último argumento del comando anterior. Ideal para comprobar que los archivos están presentes antes de ejecutar un comando destructivo como rm:

ls z* 
zebra.txt  zipfile.zip  zookeeper
→ rm !$     Same as “rm z*”

!*

Representa todos los argumentos del comando anterior:

ls myfile emptyfile hugefile
emptyfile  hugefile  myfile
→ wc !* 
      18      211     1168 myfile
       0        0        0 emptyfile
  333563  2737540 18577839 hugefile
  333581  2737751 18579007 total

Finalización del archivo

En , en mitad de la escritura de un nombre de archivo, pulsa la tecla Tabulador y el intérprete de comandos completará automáticamente el nombre de archivo por ti. Si varios nombres de archivo coinciden con lo que has introducido hasta ahora, el intérprete de comandos emite un pitido, indicando que la coincidencia es ambigua. Pulsa inmediatamente Tabulador por segunda vez y el intérprete de comandos te presentará las alternativas. Prueba esto:

cd /usr/binls un<Tab><Tab>

El intérprete de comandos muestra todos los archivos de /usr/bin que empiezan por un, como uniq y unzip. Introduce algunos caracteres más para desambiguar tu elección y vuelve a pulsar Tabulador.

Control de Trabajos Shell

jobs

Enumera tus trabajos.

&

Colocado después de un comando, lo ejecuta en segundo plano.

^Z

Tecla para suspender el trabajo actual (en primer plano).

suspend

Suspende un intérprete de comandos.

fg

Desbloquear un trabajo: ponerlo en primer plano.

bg

Haz que un trabajo suspendido se ejecute en segundo plano.

disown

Olvídate de un trabajo.

Todos los shells de Linux tienen control de trabajos: la capacidad de ejecutar comandos en segundo plano (multitarea entre bastidores) y en primer plano (el proceso activo en el prompt de tu shell). Untrabajo es simplemente la unidad de trabajo del intérprete de comandos. Cuando ejecutas un comando interactivamente, tu shell actual lo rastrea como un trabajo. Cuando el comando finaliza, el trabajo asociado desaparece. Los trabajos están en un nivel superior al de los procesos Linux; el SO Linux no sabe nada de ellos. Son meras construcciones del shell. Aquí tienes vocabulario importante sobre el control de trabajos:

Trabajo en primer plano

En un intérprete de comandos, un trabajo en ejecución que ocupa el indicador del intérprete de comandos para que no puedas ejecutar otro comando

Trabajo de fondo

En un intérprete de comandos, un trabajo en ejecución que no ocupa el prompt, por lo que puedes ejecutar otros comandos en el mismo intérprete de comandos

Suspende

Para detener temporalmente un trabajo en primer plano

Currículum

Para que un trabajo suspendido vuelva a ejecutarse en primer plano

Reniega de

Para indicar al shell que deje de seguir el trabajo; los procesos subyacentes continúan ejecutándose


puestos de trabajo

stdin

stdout

- archivo

-- opt

--ayuda

--versión

El comando incorporado jobs enumera los trabajos que se están ejecutando en tu shell actual por número y nombre:

jobs
[1]-  Running         emacs myfile &    A background job
[2]+  Stopped         ssh example.com   A suspended job

El número entero de la izquierda es el número de trabajo, y el signo más identifica el trabajo por defecto afectado por los comandos fg (en primer plano) y bg(en segundo plano).


&

Colocado al final de una línea de comandos, el símbolo ampersand hace que el comando dado se ejecute como un trabajo en segundo plano:

emacs myfile &
[2] 28090

La respuesta del shell incluye el número de trabajo (2) y el ID de proceso del comando (28090).


^Z

Escribir ^Z en un intérprete de comandos, mientras se ejecuta un trabajo en primer plano, suspende ese trabajo. Simplemente deja de ejecutarse, pero serecuerda su estado:

sleep 10                  Waits for 10 seconds
^Z
[1]+  Stopped    sleep 10
→

Ahora estás preparado para ejecutar bg para poner el comando sleep en segundo plano, o fg para reanudarlo en primer plano. También puedes dejarlo suspendido y ejecutar otros comandos.


suspende

stdin

stdout

- archivo

-- opt

--ayuda

--versión

El comando incorporado suspend pausa el shell actual si es posible, como si hubieras aplicado^Z al propio shell. Por ejemplo, si creas un shell de superusuario con sudo y quieres volver a tu shell original, suspend pausa el shell de superusuario:

whoami
smith
→ sudo bash                  Run a superuser shell
[sudo] password: xxxxxxxx
# whoami
root
# suspend                    Suspend the superuser shell
[1]+  Stopped    sudo bash
→ whoami                     Back to the original shell
smith

bg

stdin

stdout

- archivo

-- opt

--ayuda

--versión

bg [%job]

El comando incorporado bg envía un trabajo suspendido para que se ejecute en segundo plano. Sin argumentos, bg opera sobre el último trabajo suspendido. Para especificar un trabajo concreto (mostrado por el comando jobs), proporciona el número o nombre del trabajo precedido de un signo de porcentaje:

bg %2          Send job 2 to the backgroundbg %cat        Send job beginning with “cat” to the background

Algunos tipos de trabajos interactivos no pueden permanecer en segundo plano, por ejemplo, si están esperando una entrada. Si lo intentas, el shell suspende el trabajo y muestra:

[2]+  Stopped      command line here

Ahora reanuda el trabajo (con fg) y continúa.


fg

stdin

stdout

- archivo

-- opt

--ayuda

--versión

fg [%job]

El comando incorporado fg pone en primer plano un trabajo suspendido o en segundo plano. Sin argumentos, selecciona un trabajo, normalmente el último suspendido o en segundo plano. Para especificar un trabajo concreto (como se muestra en el comando jobs ), proporciona el número o nombre del trabajo precedido de un signo de porcentaje:

fg %2      Bring job 2 into the foregroundfg %cat    Bring job beginning with “cat” into the foreground

repudia

stdin

stdout

- archivo

-- opt

--ayuda

--versión

desautorizar [-ar] [-h] [%job]

El comando integrado disown indica a tu shell actual que "olvide" un trabajo. Los procesos de Linux que hay detrás del trabajo siguen ejecutándose, sólo que ya no puedes controlarlos con bg, fg, jobs, y otros comandos relacionados con el trabajo. Esto es útil para trabajos largos con los que no necesitas interactuar, o trabajos que deben seguir ejecutándose después de que tu shell salga de . Consulta también nohup en "Control de procesos".

disown %2         Forget job #2disown %cat       Forget job beginning with “cat”disown -h %2      Mark job #2 to keep running after shell exitsdisown -r         Forget all running jobsdisown -a         Forget all jobs

Ejecutar varios shells a la vez

El control de trabajos puede gestionar varios comandos a la vez, pero sólo uno puede ejecutarse en primer plano cada vez. Y lo que es más potente, puedes ejecutar varias shells a la vez, cada una con un comando en primer plano y cualquier número de comandos en segundo plano.

Si tu ordenador Linux ejecuta un sistema de ventanas como KDE o GNOME, puedes ejecutar fácilmente varios intérpretes de comandos al mismo tiempo abriendo varias ventanas de intérprete de comandos (consulta "Iniciar un intérprete de comandos"). Además, algunos programas de ventanas shell, como konsole de KDE , pueden abrir varias pestañas dentro de una misma ventana, cada una ejecutando un shell.

Incluso sin un sistema de ventanas -por ejemplo, a través de una conexión de red SSH- puedes gestionar varias shell a la vez. El comando tmux simula múltiples ventanas de shell en un terminal ASCII ordinario. Utilizando teclas especiales, puedes cambiar de una ventana virtual a otra a voluntad. (Otro programa de este tipo es screen, pero tmux está mejor mantenido y es más fácil de configurar.) Para iniciar una sesión con tmux, ejecuta:

tmux

Se inicia un nuevo intérprete de comandos con una barra de estado adicional en la parte inferior del terminal, que indica que estás ejecutando una ventana virtual. El programatmux proporciona 10 de estas ventanas por defecto, etiquetadas del 0 al 9, entre las que puedes cambiar. Al principio, cada ventana ejecuta un único intérprete de comandos, pero puedes dividir una ventana en varios "paneles" para mostrar varios intérpretes de comandos a la vez. Prueba a pulsar estas teclas para familiarizarte contmux:

  1. En la ventana actual de tmux, ejecuta ls.

  2. Pulsa ^Bc (Ctrl-B, y luego pulsa c). tmux muestra un nuevo prompt del shell en una segunda ventana virtual. La barra de estado cambia para mostrar dos ventanas virtuales numeradas como 0 y 1.

  3. En esta segunda ventana, ejecuta un comando diferente (por ejemplo, df).

  4. Pulsa ^Bn y volverás a la ventana 0, donde tu salida de ls vuelve a ser visible.

  5. Pulsa ^Bn unas cuantas veces más para alternar entre las dos ventanas virtuales.

  6. Pulsa ^B% para dividir la ventana actual en dos paneles uno al lado del otro.

  7. Pulsa ^B" para dividir el panel actual en dos, verticalmente. Ahora estás viendo tres carcasas en paneles separados.

La mayoría de los aspectos de tmux son configurables en el archivo ~/.tmux_conf, incluso la elección de ^B como clave de prefijo. Aquí tienes comandos de teclado comunes:

Pulsación de teclas Significado

^B?

Muestra la ayuda en línea. Pulsa "q" para salir.

^Bc

Crea una ventana.

^B0, ^B1... ^B9

Cambia a las ventanas 0 a 9, respectivamente.

^Bn

Pasa a la ventana siguiente, numéricamente.

^Bp

Cambia a la ventana anterior, numéricamente.

^Bl

Cambia a la ventana utilizada más recientemente.

^B%

Divídelo en dos paneles uno al lado del otro.

^B"

Divide en dos paneles el superior y el inferior.

^Bo

Salta al siguiente panel.

^B flecha izquierda

Salta al panel de la izquierda.

^B flecha derecha

Salta al panel de la derecha.

^B flecha arriba

Salta al panel superior.

^B flecha abajo

Salta al panel de abajo.

^Bq

Muestra los números de panel como referencia.

^Bx

Acaba con el panel actual.

^B^B

Envía un Ctrl-B verdadero a tu shell, ignorado por tmux.

^B^Z

Suspender tmux.

^Bd

"Desconéctate" de una sesión tmux y vuelve a tu shell original. Para volver a tmux, ejecuta tmux attach.

^D

Terminar un intérprete de comandos en una ventana o panel. Es la pulsación normal de "fin de archivo", explicada en "Terminar un intérprete de comandos", que cierra cualquier intérprete de comandos.

^B:kill-session

Mata todas las ventanas y termina tmux.

Algunas notas sobre la ejecución de tmux:

  • Si los intérpretes de comandos de tmux no tienen tus alias, variables u otros ajustes del intérprete de comandos, es porque tmux ejecuta un intérprete de comandos de inicio de sesión que no obtiene tu archivo de inicialización .bashrc. Para corregir este problema, añade estas líneas a tu archivo de inicio:

    # Source my .bashrc file
    if [ -f ~/.bashrc ]; then
      . ~/.bashrc
    fi
  • Si ejecutas un editor de texto, tmux captura todas las pulsaciones de tecla Ctrl-B, incluso las que pretenden ser comandos de edición. Pulsa ^B^B para enviar un verdadero Ctrl-B a tu editor.

  • No ejecutes tmux localmente en un escritorio gráfico ; en su lugar, ejecuta varias ventanas shell. Es más fácil y evita un problema: si has configurado tu shell para que ejecute comandos al cerrar la sesión (por ejemplo, en el archivo ~/.bash_logout), tmux 's shells ejecutará esos comandos al salir, aunque no hayas cerrado la sesión del escritorio. Esto puede tener efectos no deseados en tu sesión de inicio de sesión en el escritorio .

Matar un comando en curso

Para que mate inmediatamente un comando en primer plano, pulsa ^C. Aquí mato el comando catporque imprime un archivo enorme:

cat hugefile
Lorem ipsum dolor sit amet, consectetur adipiscing
odio. Praesent libero. Sed cursus ante dapibus diam.
quis sem at nibh elementum blah blah blah ^C

Para matar un comando en segundo plano, llévalo a primer plano con fgy luego pulsa ^C:

sleep 50 &
[1] 12752
→ jobs
[1]-  Running       sleep 50 &
→ fg %1
sleep 50
^C

o ejecuta el comando kill descrito en"Control de procesos". La combinación de teclas ^C es una función del intérprete de comandos. No tiene efecto en los programas que "atrapan" ^C y no terminan, como los editores de texto y las aplicaciones GUI. Para ellos, utiliza kill.

Terminar un caparazón

Para terminar un intérprete de comandos, ejecuta el comando exit:

exit

o pulsa ^D en una línea sola. La pulsación ^D envía una señal de "fin de archivo" a cualquier programa que lea de la entrada estándar. Esto incluye al propio shell.

Adaptar el comportamiento del caparazón

Varios archivos de tu directorio personal controlan el comportamiento de los shells bash. Los archivos de inicio .bash_profile, .bash_login, y .profile contienen comandos que se ejecutan cada vez que te conectas. (Elige sólo un archivo de inicio y quédate con él. Te recomiendo.bash_profile porque algunos otros shells también utilizan .profile.) Los comandos del archivo de inicialización .bashrc se ejecutan cada vez que inicias un shell interactivo, y los comandos de .bash_logout se ejecutan cada vez que cierras la sesión. Todos estos archivos pueden establecer variables, ejecutar programas, imprimir mensajes tontos o lo que quieras. Otros shells de Linux utilizan otros archivos de configuración, como se muestra en la Tabla 1-1.

Tabla 1-1. Ficheros de configuración del shell en $HOME y cuándo se leen
Concha Al iniciar sesión Por otras conchas interactivas Al cerrar sesión

bash

.bash_perfil, .bash_login,
.perfil

.bashrc

.bash_logout

guión

.perfil

pescado

.config/pescado/config.pescado

.config/pescado/config.pescado

ksha

.profile, .kshrc

.kshrc

tcsh

.tcshrc, .cshrc, .login

.tcshrc, .cshrc

zsha

.zshenv, .zperfil, .zlogin

.zshenv, .zshrc

.zlogout

a Para anular estas rutas de archivo con variables de entorno, consulta la página del manual.

Otros archivos de configuración del intérprete de comandos viven en /etc para el control de todo el sistema; consulta la página del manual respectivo, o manpage, de cada intérprete de comandos. Todos estos archivos de configuración son ejemplos de scripts de shell: archivosejecutables que contienen comandos de shell. Cubro esta función con más detalle en en"Programación con scripts de shell".

Conseguir ayuda

Si necesitas más información de la que proporciona este libro, aquí tienes varias formas de obtener más ayuda:

Ejecuta el comando man

El comando man muestra la documentación de un programa determinado. Por ejemplo, para aprender a contar palabras en un archivo con wc, ejecuta:

man wc

Para buscar páginas de manual (manpages) por palabra clave de un tema concreto, utiliza la opción -kseguida de lapalabra clave:

man -k database

Si la lista de páginas de manual es más larga que la pantalla, envíala a lesspara visualizarla en páginas (pulsa q para salir):

man -k database | less
Ejecuta el comando info

El comando info es un sistema de ayuda hipertextual ampliado que cubre muchos comandos de Linux.

info ls

Mientras se ejecuta info, algunas pulsaciones útiles son:

  • Para obtener ayuda, pulsa h

  • Para salir, pulsa q

  • Para avanzar y retroceder páginas, utiliza la barra espaciadora y la tecla Retroceso, respectivamente

  • Para saltar entre hipervínculos, pulsa Tabulador

  • Para seguir un hiperenlace, pulsa Intro

    Si info no tiene documentación sobre un comando determinado, muestra la página de manual del comando. Para obtener un listado de la documentación disponible, escribeinfo solo. Para aprender a navegar por el sistema info, ejecuta info info.

Utiliza la opción --help (si existe)

Muchos comandos de Linux responden a la opción --help o -h imprimiendo un breve mensaje de ayuda. Inténtalo:

wc --help

Si la salida es más larga que la pantalla, canalízala en less:

wc --help | less
Examina el directorio /usr/share/doc

Este directorio contiene documentos de apoyo para los programas, normalmente organizados por nombre y versión. Por ejemplo, los archivos para el editor Emacs versión 28 se encuentran probablemente (dependiendo de la distro) en /usr/share/doc/emacs28.

Sitios web específicos de las distribuciones

La mayoría de las distribuciones de Linux tienen un sitio oficial con documentación, foros de debate y otros recursos. Busca en la web el nombre de tu distro (por ejemplo, "Ubuntu") para encontrar su sitio web. La wiki de Arch Linux es especialmente informativa, independientemente de tu distro.

Sitios de ayuda de Linux

Haz preguntas sobre Linux encunix.stakexchange.org,linuxquestions.org,itsfoss.community,y nixcraft.com.

Búsqueda web

Para descifrar un mensaje de error de Linux, pégalo en un buscador, textualmente, rodeado opcionalmente de comillas dobles .

Con esto concluye mi visión general básica de Linux y el shell. Ahora pasemos a los detalles específicos de los comandos de Linux. El resto del libro enumera y describe los comandos más útiles para trabajar con archivos, procesos, usuarios, redes, multimedia y mucho más.

1 GNOME, KDE y otros entornos están construidos sobre un sistema de ventanas común que es X o Wayland. Para ver qué sistema estás utilizando, ejecuta el comando echo $XDG_SESSION_TYPE.

2 Si ves un mensaje de error "comando no encontrado", no te preocupes: es probable que el comando no esté instalado en tu sistema. Consulta "Instalación de paquetes de software".

3 El usuario "silver", que aparece dos veces, está ejecutando dos shells interactivos a la vez.

4 En Linux, todos los archivos y directorios descienden de la raíz. Esto es distinto a Windows, en el que se accede a los distintos dispositivos por letras de unidad.

5 Los nombres de archivo de Linux distinguen entre mayúsculas y minúsculas, por lo que las mayúsculas y minúsculas no son equivalentes.

6 Algunas distribuciones ya no hacen estas distinciones. Fedora, por ejemplo, hace de /bin un enlace simbólico a /usr/bin.

7 Consulta también mi libro de seguimiento, Linux eficiente en la línea de comandos, para ampliar tus conocimientos.

8 Algunas configuraciones utilizan ~/.bash_aliases para este fin.

9 Por ejemplo, puedes capturar la salida estándar en un archivo y que los mensajes de error estándar sigan apareciendo en pantalla.

Get Guía de bolsillo de Linux, 4ª edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.