El sistema de archivos de Linux es un árbol que nace en / —la raíz— y se ramifica hacia abajo. Cada archivo tiene exactamente una dirección desde esa raíz. Una ruta absoluta es esa dirección completa, sin ambigüedad: /home/ana/documentos/informe.txt significa lo mismo sin importar desde dónde la uses. Una ruta relativa, en cambio, es una dirección parcial que solo tiene sentido si sabes desde dónde partes: documentos/informe.txt puede apuntar a sitios completamente distintos dependiendo de tu posición en el árbol.
Esa “posición” es el directorio de trabajo (working directory): el directorio donde estás parado en este momento dentro de la sesión. Cada proceso en Linux tiene el suyo propio —no es un estado global del sistema, sino una propiedad del proceso. Cuando abres una terminal, el shell arranca con tu directorio personal como directorio de trabajo. Cuando escribes ls sin argumentos, el kernel resuelve ese comando usando ese contexto. Cuando escribes cat documentos/informe.txt, el kernel pega tu directorio de trabajo delante de la ruta relativa y construye la ruta absoluta completa antes de abrir el archivo.
Esto importa especialmente en scripts. Si escribes cat documentos/informe.txt dentro de un script y lo ejecutas desde /tmp, el kernel buscará /tmp/documentos/informe.txt, que casi con toda seguridad no existe. El script falla no porque esté mal escrito en apariencia, sino porque depende de un contexto —el directorio de trabajo— que no controla. Por eso la regla es concreta: en scripts, usa rutas absolutas, o cambia explícitamente de directorio al principio con cd y verifica que funcionó. Usar rutas relativas en scripts es apostar a que quien los ejecute lo hará desde el lugar correcto, y esa apuesta se pierde en producción, en cron, en CI/CD, o cuando otro usuario los usa.
Para saber en qué directorio estás en cualquier momento, usas pwd (print working directory). Es la brújula básica.
# Comprobamos dónde estamos
pwd
# Resultado típico al abrir terminal: /home/ana
# Navegamos con ruta absoluta — funciona desde cualquier sitio
cd /home/ana/documentos
# Ahora pwd confirma la posición nueva
pwd
# /home/ana/documentos
# Ruta relativa: ".." sube un nivel (al padre del directorio actual)
# Desde /home/ana/documentos, esto lleva a /home/ana/proyectos
cd ../proyectos
pwd
# /home/ana/proyectos
# Un punto solo "." representa el directorio actual
# Este comando no mueve nada, pero ilustra que "." es una ruta válida
ls .
# Ruta relativa hacia abajo: entra en "web" dentro del directorio actual
cd web
pwd
# /home/ana/proyectos/web
# Ahora simulamos el problema de los scripts con rutas relativas.
# Imagina un script que hace esto:
# cat ../datos/clientes.csv
# Si lo ejecutas desde /home/ana/proyectos/web, busca:
# /home/ana/proyectos/datos/clientes.csv ← correcto
# Si lo ejecutas desde /tmp, busca:
# /tmp/datos/clientes.csv ← no existe, falla
# La solución en un script real: anclar la ruta al directorio del propio script
# Esta línea obtiene la ruta absoluta del directorio donde vive el script,
# sin importar desde dónde se invoque
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# A partir de ahí, construyes rutas absolutas derivadas
cat "${SCRIPT_DIR}/../datos/clientes.csv"
SCRIPT_DIR es el patrón que resuelve el problema de raíz. $0 es la ruta con la que el shell invocó el script —puede ser relativa o absoluta—, dirname extrae el directorio que la contiene, y el cd combinado con pwd la convierte en absoluta sin ambigüedad. El && entre los dos comandos es importante: si el cd falla por cualquier razón, pwd no se ejecuta y SCRIPT_DIR no recibe un valor incorrecto silencioso.
La doble resolución cd "$(dirname "$0")" && pwd parece redundante hasta que ves qué pasa cuando el script se invoca desde un cron con ./scripts/backup.sh o desde un enlace simbólico: dirname "$0" devuelve ./scripts o el directorio del enlace, que son rutas relativas. El cd las resuelve contra el directorio de trabajo de ese proceso, y pwd devuelve la ruta canónica absoluta. Sin ese paso, el cat posterior fallaría igual que si hubieras escrito la ruta relativa directamente.
Los dos puntos .. merecen mención explícita: son una entrada real que existe dentro de cada directorio y apunta a su padre. ../../etc/passwd desde /home/ana/proyectos resuelve a /etc/passwd. El kernel sigue esos saltos uno a uno hasta llegar al destino o fallar en algún punto intermedio.
N° 16