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.
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
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 myfilewc -lw myfile
Two individual options
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 -q
para "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/shadowwc: /etc/shadow: Permission denied → sudo wc -l /etc/shadow
This fails
[sudo] password: xxxxxxxx 51 /etc/shadow
Run with sudo
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
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→ cd ../mydir
Enter subdirectory d of my current directory
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
/home/smith → cd $HOME/linuxpocketguidePrint the directory name
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 ~
/home/smith → cd ~/linuxpocketguidePrint the directory name
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
→ pwdVisit Fred's home directory, if it exists
/home/fredThe “print working directory” command
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.
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:
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:
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: |
2-4 |
Permisos para el propietario del archivo: lectura ( |
5-7 |
Permisos para el grupo del archivo: |
8-10 |
Permisos para el resto de usuarios: |
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.
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 |
---|---|
Tu directorio personal, como /home/smith |
|
Tu nombre de usuario, por ejemplo |
|
Tu buzón de entrada, como /var/spool/mail/smith |
|
El directorio anterior de tu shell, antes del último comando |
|
Tu ruta de búsqueda en el shell: directorios separados por dos puntos |
|
El directorio actual de tu shell |
|
La ruta a tu shell (por ejemplo, /bin/bash) |
|
El tipo de tu terminal (por ejemplo, xterm o vt100) |
|
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=3 → export 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 whowho is hashed (/usr/bin/who)
The output may vary:
who is /usr/bin/who
This means "who" is cached
→ which who /usr/bin/who
This means "who" isn't cached
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/sbin → echo $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 llwc is /usr/bin/wc
Print the types of these commands
cd is a shell builtin
A program in the filesystem
ll is aliased to `ls -lG'
A built-in shell command
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→ command >> outfile
Create/overwrite 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→ command &> outfile
Separate files
→ command >& outfile
Single file (preferred)
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 jpegexample → ls *.jpg | cut -d. -f1 > /tmp/jpegs → ls *.txt | cut -d. -f1 > /tmp/texts → diff /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*aardvark adamantium apple → echo a\*
A file pattern
a* → echo "I live in $HOME"
A literal asterisk
I live in /home/smith → echo "I live in \$HOME"
Print a variable value
I live in $HOME
Print a literal dollar sign
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 |
---|---|---|
|
|
Ir al comando anterior |
|
|
Ir al siguiente comando |
|
Buscar un comando anterior de forma interactiva |
|
|
|
Avanza un carácter |
|
|
Retroceder un carácter |
|
|
Ir al principio de la línea |
|
|
Ir al final de la línea |
|
|
Borrar el carácter siguiente |
|
|
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 |
---|---|
|
Imprime tu historial |
|
Imprime los N comandos más recientes de tu historial |
|
Borrar (eliminar) tu historial |
|
|
|
Representa el comando número N de tu historial |
|
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 → ls z*
zebra.txt zipfile.zip zookeeper
→ rm !$ |
|
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/bin → ls 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
|
Enumera tus trabajos. |
|
Colocado después de un comando, lo ejecuta en segundo plano. |
|
Tecla para suspender el trabajo actual (en primer plano). |
|
Suspende un intérprete de comandos. |
|
Desbloquear un trabajo: ponerlo en primer plano. |
|
Haz que un trabajo suspendido se ejecute en segundo plano. |
|
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
- 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 &[2]+ Stopped ssh example.com
A background job
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[sudo] password: xxxxxxxx # whoami root # suspend
Run a superuser shell
[1]+ Stopped sudo bash → whoami
Suspend the superuser shell
smith
Back to the original shell
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→ bg %cat
Send job 2 to the background
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→ fg %cat
Bring job 2 into the foreground
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→ disown %cat
Forget job #2
→ disown -h %2
Forget job beginning with “cat”
→ disown -r
Mark job #2 to keep running after shell exits
→ disown -a
Forget all running jobs
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
:
-
En la ventana actual de
tmux
, ejecutals
. -
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. -
En esta segunda ventana, ejecuta un comando diferente (por ejemplo,
df
). -
Pulsa
^Bn
y volverás a la ventana 0, donde tu salida dels
vuelve a ser visible. -
Pulsa
^Bn
unas cuantas veces más para alternar entre las dos ventanas virtuales. -
Pulsa
^B%
para dividir la ventana actual en dos paneles uno al lado del otro. -
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 |
---|---|
|
Muestra la ayuda en línea. Pulsa "q" para salir. |
|
Crea una ventana. |
|
Cambia a las ventanas 0 a 9, respectivamente. |
|
Pasa a la ventana siguiente, numéricamente. |
|
Cambia a la ventana anterior, numéricamente. |
|
Cambia a la ventana utilizada más recientemente. |
|
Divídelo en dos paneles uno al lado del otro. |
|
Divide en dos paneles el superior y el inferior. |
|
Salta al siguiente panel. |
|
Salta al panel de la izquierda. |
|
Salta al panel de la derecha. |
|
Salta al panel superior. |
|
Salta al panel de abajo. |
|
Muestra los números de panel como referencia. |
|
Acaba con el panel actual. |
|
Envía un Ctrl-B verdadero a tu shell, ignorado por |
|
Suspender |
|
"Desconéctate" de una sesión |
|
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. |
|
Mata todas las ventanas y termina |
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 porquetmux
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 cat
porque 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 fg
y 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
.
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.
Concha | Al iniciar sesión | Por otras conchas interactivas | Al cerrar sesión |
---|---|---|---|
bash |
.bash_perfil, .bash_login, |
.bashrc |
.bash_logout |
.perfil |
|||
.config/pescado/config.pescado |
.config/pescado/config.pescado |
||
ksha |
.profile, .kshrc |
.kshrc |
|
.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 conwc
, ejecuta:→ man wc
Para buscar páginas de manual (manpages) por palabra clave de un tema concreto, utiliza la opción
-k
seguida de lapalabra clave:→ man -k database
Si la lista de páginas de manual es más larga que la pantalla, envíala a
less
para visualizarla en páginas (pulsaq
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, ejecutainfo 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.