¿Qué ocurre exactamente cuando ejecutas un comando en Linux? Puede parecer un proceso directo, pero en realidad pueden pasar muchas cosas dependiendo de si se trata de un programa ejecutable, un script de shell, un comando interno (builtin), una función definida por el usuario o un alias.
Los distintos tipos de comandos en Linux
Un programa ejecutable (binario) es un archivo en disco con un formato reconocible. En Linux suele ser ELF, en Mac Mach-O. Es un archivo a bajo nivel que el shell puede pasar directamente al kernel para que lo ejecute.
Un script de shell es más alto nivel y legible por humanos. Puede contener otros comandos y estar escrito en lenguajes interpretados como Bash, Perl o Python.
Un comando interno (builtin) es parte del propio shell, siempre disponible y pensado para tareas básicas que afectan directamente al entorno del shell.
Una función de shell es como un mini-script, que agrupa varios comandos bajo un solo nombre. Se suelen cargar al inicio para tenerlas siempre disponibles.
Un alias es simplemente un nombre alternativo que puedes usar para representar cualquiera de los anteriores, normalmente para abreviar comandos largos.
Ejecutando un programa ejecutable
El tipo más habitual de comando es un archivo ejecutable. Muchos programas comunes están estandarizados por POSIX, lo que garantiza su disponibilidad en la mayoría de sistemas Unix o similares, como Linux o macOS.
Ejemplos: cat, diff o vi.
Otros programas como Apache, Neofetch o tree requieren instalación manual.
Puedes ejecutar un programa de dos formas:
Indicando su ruta absoluta o relativa:
/bin/cat archivo.txt
O usando sólo el nombre del programa:
cat archivo.txt
En este segundo caso, el sistema usa la variable de entorno PATH, una lista separada por dos puntos (:), para buscar el ejecutable en las rutas especificadas, en orden de aparición.
Esto te permite, por ejemplo, tener una versión personalizada de un comando y que el sistema la use antes que la versión por defecto.
Ejecutando un script de shell
Un script se comporta de forma similar a un ejecutable pero es diferente. Un ejemplo simple sería:
#!/bin/sh
echo Esto es un script sencillo
La línea que empieza por #! (conocida como shebang) indica al sistema qué intérprete usar, en este caso /bin/sh.
Para que un script funcione como un ejecutable, necesita tener el permiso de ejecución activado. Si no lo tiene, obtendrás un error:
bash: permiso denegado
Aunque puedes ejecutarlo igualmente pasándoselo al intérprete manualmente:
sh script.sh
Y si tienes dudas sobre el tipo de archivo, puedes usar el comando file.
Ejecutando un comando interno del shell (builtin)
Algunos comandos están integrados en el propio shell, y por tanto no existen como archivos en disco. Ejemplos: cd, echo o kill.
Estos comandos se llaman builtins y, al estar compilados en el shell, se ejecutan de forma muy rápida. En algunos sistemas puede haber scripts con el mismo nombre (como /usr/bin/cd), pero suelen ser envoltorios para cumplir con POSIX.
Para saber más sobre ellos puedes usar tldr, ya que a menudo tienen documentación limitada o compartida.
Los comandos builtins suelen tener pocas opciones disponibles. Por ejemplo, cd acepta -L o -P, pero no --help.
Llamando a una función de shell
Puedes definir funciones personalizadas usando esta sintaxis en bash:
nombre_funcion() {
comandos
}
O bien:
function nombre_funcion {
comandos
}
Un ejemplo práctico sería:
mkd () {
mkdir -p "$@"
cd "$@" || exit
}
Luego puedes ejecutarlo directamente como:
mkd nueva_carpeta
Recuerda: para que la función esté disponible siempre, debes cargarla en tu archivo de configuración del shell (~/.bashrc, ~/.zshrc, etc.) usando source.
Usando un alias
Un alias te permite ahorrar tiempo con comandos largos o comunes. Por ejemplo:
alias ls='ls -GF'
Así, al escribir simplemente ls, estarás ejecutando ls -GF.
Puedes crear alias en cualquier momento con el comando alias, verlos todos escribiendo alias y eliminarlos con unalias. Para que persistan entre sesiones, añádelos también a tu ~/.bashrc o ~/.zshrc.
