Linux · Capítulo 3

Linux Essentials: el camino en un sistema Linux

Primeros pasos en la shell: sintaxis de comandos, comillas y variables, PATH, cómo pedir ayuda, rutas, archivos y comodines.

Este capítulo cubre el tema 2 del examen Linux Essentials: moverse por un sistema Linux desde la línea de comandos. Es donde se pasa de la teoría a la práctica, así que abre una terminal y ve probando cada comando.

La shell

La shell o intérprete de comandos es el programa que recibe las órdenes que escribes con el teclado y se las pasa al sistema operativo. También se le llama terminal o línea de comandos, aunque, en sentido estricto, la terminal es la ventana y la shell es el programa que corre dentro.

Shell Características
Bash La más extendida; la shell por defecto en la mayoría de distribuciones. Es la del examen.
sh La shell clásica de Unix; base del estándar POSIX.
zsh Compatible con Bash y muy configurable; la shell por defecto en macOS.
csh / tcsh Sintaxis parecida al lenguaje C.
fish Pensada para ser amigable, con sugerencias automáticas.
echo $SHELL        # qué shell usa tu usuario
clear              # limpia la pantalla (o Ctrl + L)
pwd                # print working directory: en qué directorio estás

Anatomía de un comando

Un comando tiene tres partes: el comando, sus opciones (modifican cómo se comporta y suelen empezar con - o --) y sus argumentos (sobre qué actúa).

Las partes de un comando: comando, opciones y argumentos

ls                 # comando solo
ls -l              # comando + opción
ls -l /home        # comando + opción + argumento
ls -la /home       # varias opciones cortas juntas: -l y -a
ls --all /home     # opción larga

En los comandos GNU el orden de opciones y argumentos suele ser flexible (ls /home -la también funciona), pero la convención es comando, opciones, argumentos.

Mostrar texto: echo y las comillas

echo "Hola mundo"
echo -e "Hola\tmundo"      # -e interpreta \t (tabulador)
echo -e "Hola\nmundo"      # y \n (salto de línea)

Las comillas cambian cómo la shell trata el texto:

Comillas Comportamiento Ejemplo
Dobles "..." Expanden las variables ($VAR) y los comandos $(...). echo "Tu PATH es $PATH"
Simples '...' Todo es literal: no se expande nada. echo 'Tu PATH es $PATH'
Barra invertida \ Escapa un solo carácter. echo "Cuesta \$5"
echo "Hoy es $(date +%A)"    # sustitución de comandos

Saber qué es cada comando: type, which, uname, whatis

type cd          # cd is a shell builtin   (comando interno de Bash)
type ls          # puede ser un alias de ls --color=auto
type cp          # cp is /usr/bin/cp      (programa externo)

which cp         # ruta del ejecutable: /usr/bin/cp

uname            # nombre del kernel: Linux
uname -a         # toda la información: versión, arquitectura, nombre del equipo...
cat /etc/os-release   # nombre y versión de la distribución

La diferencia importa: los comandos internos (builtins) forman parte de la propia shell; los externos son programas en disco que la shell busca en los directorios del PATH.

Variables: set, export, unset y env

saludo="hola"            # variable local de la shell (sin espacios alrededor del =)
echo $saludo

export EDITOR=nano       # variable de entorno: la heredan los programas que lances
env                      # lista las variables de entorno
set                      # lista variables y funciones de la shell
unset saludo             # elimina la variable

set +o history           # desactiva el historial en esta sesión
set -o history           # lo vuelve a activar

La variable PATH

PATH contiene la lista de directorios, separados por :, donde la shell busca los comandos externos. Gracias a ella escribes ls en lugar de /usr/bin/ls.

echo $PATH
# /usr/local/bin:/usr/bin:/bin:...

Para ejecutar tus propios scripts desde cualquier directorio, añade su carpeta al PATH:

mkdir -p ~/scripts
export PATH="$PATH:$HOME/scripts"

Ese cambio dura solo hasta cerrar la sesión. Para que sea permanente, guárdalo en ~/.bashrc (en zsh, ~/.zshrc) y recarga el archivo:

echo 'export PATH="$PATH:$HOME/scripts"' >> ~/.bashrc
source ~/.bashrc

Usa comillas simples en el echo: así se guarda el texto $PATH tal cual y se expande al abrir cada sesión. Con comillas dobles se guardaría el valor actual completo.

Tu primer script y el shebang

La primera línea de un script, el shebang, indica qué intérprete debe ejecutarlo:

#!/bin/bash
# ~/scripts/hola.sh
echo "Hola, $USER"
echo "Hoy es $(date +%d/%m/%Y)"
chmod +x ~/scripts/hola.sh   # darle permiso de ejecución
hola.sh                      # funciona desde cualquier lugar si ~/scripts está en el PATH
./hola.sh                    # si no, se ejecuta indicando la ruta

Cómo pedir ayuda

Herramienta Para qué sirve
comando --help Resumen rápido de opciones.
man comando El manual completo. Se navega con flechas, / busca, q sale.
info comando Documentación más extensa, con enlaces entre secciones.
whatis comando Descripción de una línea (igual que man -f).
apropos palabra Busca la palabra en las descripciones de los manuales (igual que man -k).
locate archivo Encuentra archivos por nombre usando una base de datos que se actualiza con updatedb.
whereis comando Dónde están el binario, el código fuente y el manual de un comando.
/usr/share/doc/ Documentación adicional de los paquetes instalados.

El manual está dividido en secciones. La misma palabra puede aparecer en varias:

Sección Contenido
1 Comandos de usuario
5 Formatos de archivos de configuración
8 Comandos de administración del sistema
man passwd       # sección 1: el comando passwd
man 5 passwd     # sección 5: el archivo /etc/passwd
man -f cp        # = whatis cp
man -k copy      # = apropos copy

Directorios y rutas

El sistema de archivos de Linux es un árbol que empieza en la raíz, /. Cada usuario tiene su directorio personal, normalmente /home/usuario, que también se escribe ~.

Rutas absolutas y relativas en el árbol de directorios

  • Una ruta absoluta empieza en / y es válida desde cualquier lugar: /home/usuario/documentos/notas.txt
  • Una ruta relativa parte del directorio donde estás y no empieza con /: si estás en /home/usuario, la misma ruta es documentos/notas.txt.
  • . es el directorio actual y .. el directorio padre.

Moverse con cd

cd               # ir a tu directorio personal (igual que cd ~)
cd /etc          # ruta absoluta
cd documentos    # ruta relativa
cd ..            # subir al directorio padre
cd -             # volver al directorio anterior
cd /             # ir a la raíz

Listar con ls

ls -a        # incluye archivos ocultos (empiezan con .)
ls -l        # formato largo: permisos, propietario, tamaño, fecha
ls -lh       # tamaños legibles (K, M, G)
ls -S        # ordena por tamaño, el mayor primero
ls -lr       # orden inverso
ls -R        # recursivo: entra en los subdirectorios

Crear, mover, copiar y borrar

touch notas.txt              # crea un archivo vacío (o actualiza su fecha)

mkdir proyectos              # crea un directorio
mkdir dir1 dir2 dir3         # varios a la vez
mkdir -p cursos/linux/lpi    # crea también los directorios intermedios
mkdir "mis fotos"            # nombre con espacios (o: mkdir mis\ fotos)

cp notas.txt copia.txt       # copia un archivo
cp -r proyectos respaldo     # copia un directorio completo

mv notas.txt proyectos/      # mueve
mv copia.txt apuntes.txt     # renombra

rm apuntes.txt               # borra un archivo
rmdir dir1                   # borra un directorio vacío
rm -r respaldo               # borra un directorio y todo su contenido

Cuidado: rm no usa papelera. Lo que borras desaparece. Añade -i para que pida confirmación.

Una diferencia que cae en el examen: mv conserva el propietario y los permisos del archivo, porque no crea uno nuevo; cp crea un archivo nuevo que pertenece al usuario que copia.

Y recuerda: Linux distingue mayúsculas de minúsculas. Notas.txt y notas.txt son archivos distintos.

El historial

history          # lista los comandos ejecutados, numerados
!123             # repite el comando número 123
!!               # repite el último comando

Ctrl + R busca hacia atrás en el historial mientras escribes.

Comodines (globbing)

Los comodines permiten referirse a varios archivos a la vez. Los expande la shell antes de ejecutar el comando.

Comodín Significado Ejemplo Coincide con
* Cualquier cantidad de caracteres (incluso ninguno) ls *.txt notas.txt, a.txt
? Exactamente un carácter ls foto?.jpg foto1.jpg, fotoA.jpg
[abc] Uno de los caracteres indicados ls informe[123].pdf informe1.pdf, informe3.pdf
[a-z] Un carácter del rango ls [a-c]* archivos que empiezan por a, b o c
[!abc] Cualquier carácter excepto esos ls [!0-9]* archivos que no empiezan por un dígito
[[:digit:]] Una clase de caracteres (dígitos, letras...) ls *[[:digit:]].log app1.log, app2.log
ls *.txt                  # todos los .txt
ls ??.conf                # nombres de dos caracteres terminados en .conf
cp *.jpg ~/fotos/         # copia todas las imágenes .jpg
rm log-2026-0[1-3]-*.txt  # borra los registros de enero a marzo

Un truco al construir patrones: empieza por la parte más distintiva, que muchas veces está al final del nombre (la extensión), y ve añadiendo condiciones hacia la izquierda.

Ideas clave

  • La shell (Bash) interpreta lo que escribes; la sintaxis es comando, opciones, argumentos.
  • Las comillas dobles expanden variables; las simples no.
  • type distingue comandos internos de externos; which muestra la ruta de un ejecutable.
  • PATH dice dónde buscar comandos; para cambios permanentes, ~/.bashrc.
  • Ayuda: --help, man (con secciones), info, whatis, apropos, locate.
  • Rutas absolutas empiezan en /; las relativas, en el directorio actual. ., .., ~.
  • mv conserva el propietario; cp crea un archivo nuevo. Linux distingue mayúsculas.
  • Comodines: *, ?, [...], [!...] y clases como [[:digit:]].