Comando which de Linux: Localización de comandos

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a utilizar el comando which para encontrar el archivo ejecutable que ejecutará un shell al invocar un comando. Comprobarás comandos instalados, gestionarás comandos no disponibles, listarás múltiples coincidencias y verás cómo la variable PATH afecta al resultado.

Para facilitar la comprensión del comportamiento de which, este laboratorio también utiliza algunos conceptos básicos de shell, como scripts sencillos, permisos de ejecución y cambios temporales en PATH. Cada concepto nuevo se explica en el momento oportuno para que puedas centrarte en entender por qué which devuelve una ruta específica.

Comprender los fundamentos de 'which'

A medida que te integras en tu nuevo puesto en TechCorp, tu jefe de equipo te pide que verifiques la instalación de algunas herramientas de desarrollo clave. El comando which será tu utilidad principal para esta tarea.

El comando which se utiliza para localizar el archivo ejecutable asociado a un comando determinado buscando en los directorios listados en la variable de entorno PATH.

Comencemos localizando el compilador gcc:

which gcc

Deberías ver una salida similar a esta:

/usr/bin/gcc

Esta salida te indica que el ejecutable gcc se encuentra en el directorio /usr/bin. Esto significa que cuando escribes gcc en la terminal, el sistema ejecutará el archivo ubicado en /usr/bin/gcc.

Ahora, intentemos localizar otra herramienta esencial, python:

which python

Es posible que veas algo como:

/usr/local/bin/python

El comando which busca en los directorios listados en tu variable de entorno PATH y devuelve la primera coincidencia que encuentra. Si ves una ruta diferente, no te preocupes: simplemente significa que Python está instalado en una ubicación distinta en tu sistema.

Gestión de comandos inexistentes

Tu jefe de equipo menciona que TechCorp solía utilizar una herramienta de compilación personalizada llamada techbuild. Comprobemos si todavía está instalada:

which techbuild

Es posible que no veas ninguna salida (en Bash Shell), o que veas un mensaje de error como techbuild not found (en Zsh Shell).

Esto ocurre porque which no devuelve nada si no puede encontrar el comando en tu PATH. No te alarmes por la falta de salida; es la forma que tiene el comando de decirte que techbuild no se encuentra en ninguno de los directorios de tu PATH.

Para hacer este comportamiento más explícito, podemos utilizar un script de shell sencillo. Introduciremos dos conceptos nuevos aquí:

  1. Un script de shell es un archivo de texto que almacena comandos y los ejecuta en orden.
  2. El patrón cat <<'EOF' ... EOF escribe varias líneas en un archivo sin tener que gestionar varias comillas anidadas.

Creemos un script para comprobar techbuild:

cat > ~/check_techbuild.sh <<'EOF'
#!/bin/bash
if which techbuild >/dev/null 2>&1; then
  echo "techbuild is installed"
else
  echo "techbuild is not installed"
fi
EOF

Este comando crea un archivo llamado ~/check_techbuild.sh y lo rellena con un pequeño script de Bash.

Aquí tienes el significado de las líneas importantes:

  • #!/bin/bash le indica a Linux que ejecute el script con Bash.
  • which techbuild comprueba si el comando se puede encontrar en tu PATH.
  • >/dev/null 2>&1 oculta la salida normal y la salida de error para que el script pueda imprimir su propio mensaje de resultado claro.

Ahora, otorga permiso de ejecución al archivo y ejecútalo:

chmod +x ~/check_techbuild.sh

El comando chmod +x añade permiso de ejecución, lo que permite a Linux ejecutar el archivo como un comando.

~/check_techbuild.sh

Este script imprime techbuild is not installed porque which no pudo encontrar ese comando.

Descubrir instalaciones múltiples

A medida que continúas configurando tu entorno, te das cuenta de que TechCorp utiliza varias versiones de Python para diferentes proyectos. La opción -a de which puede ayudarte a descubrir todas las instalaciones de un comando:

which -a python

Es posible que veas una salida como esta:

/usr/local/bin/python
/usr/bin/python
/bin/bin/python

Esta salida indica que hay varias instalaciones de Python en el sistema. La opción -a le dice a which que imprima todos los ejecutables coincidentes en PATH, no solo el primero.

Entender esto es crucial porque te muestra todos los posibles ejecutables de Python que podrían ejecutarse, dependiendo de tu configuración de PATH. El primero de la lista es el que se ejecutará cuando escribas python en la terminal.

Comprender la prioridad de PATH

Tu jefe de equipo explica que el orden de los directorios en la variable PATH determina qué versión de un comando se utiliza por defecto. Examinemos tu PATH:

echo $PATH

Verás una lista de directorios separados por dos puntos. Por ejemplo:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

El orden importa: los directorios listados primero tienen mayor prioridad. Esto significa que si hay dos ejecutables con el mismo nombre en directorios diferentes, se utilizará el que esté en el directorio que aparece primero en PATH.

La configuración del laboratorio ya creó un comando ls personalizado en ~/custom_bin. Añade ese directorio al principio de tu PATH para que se compruebe antes que los directorios del sistema:

export PATH=$HOME/custom_bin:$PATH

Ahora comprueba qué ls se ejecutará por defecto:

which ls

Deberías ver una salida similar a esta:

/home/labex/custom_bin/ls

Para ver todos los comandos ls coincidentes en tu PATH, ejecuta:

which -a ls

Deberías ver tu comando personalizado primero, seguido de las versiones del sistema:

/home/labex/custom_bin/ls
/usr/bin/ls
/bin/ls

Esto demuestra claramente la prioridad de PATH: which ls devuelve el primer ejecutable coincidente, mientras que which -a ls muestra la lista completa de resultados de búsqueda.

Crear un comando personalizado

Tu jefe de equipo sugiere crear un comando personalizado sencillo para demostrar cómo interactúa which con el PATH. Creemos un script llamado hello en tu directorio personal:

cat > ~/hello <<'EOF'
#!/bin/bash
echo "Hello from TechCorp!"
EOF
chmod +x ~/hello

Esto crea un nuevo archivo llamado hello en tu directorio personal y lo hace ejecutable. El script imprime Hello from TechCorp! cuando se ejecuta.

Ahora, intenta ejecutarlo:

hello

Obtendrás un error de "command not found" porque tu directorio personal no está en el PATH. El PATH es una lista de directorios donde el shell busca archivos ejecutables.

Añadamos tu directorio personal al PATH temporalmente:

export PATH="$PATH:$HOME"

Este comando añade tu directorio personal al final del PATH para la sesión de terminal actual. El comando export hace que el PATH actualizado esté disponible para los comandos que ejecutes después.

Ahora puedes ejecutar hello, y which lo encontrará:

hello
which hello

Deberías ver "Hello from TechCorp!" y la ruta a tu script. Esto demuestra cómo which encuentra ejecutables en cualquier directorio listado en tu PATH.

Resumen

En este laboratorio, has aprendido a utilizar el comando which para localizar archivos ejecutables en el PATH de tu sistema. Has descubierto cómo:

  1. Encontrar la ubicación de programas instalados.
  2. Gestionar comandos inexistentes.
  3. Descubrir instalaciones múltiples del mismo comando.
  4. Comprender la prioridad de PATH.
  5. Crear y localizar comandos personalizados.

También has practicado la escritura de scripts de shell sencillos, haciendo que los archivos sean ejecutables con chmod +x y ajustando el PATH para controlar qué comando se ejecuta.

Estas habilidades serán invaluables a medida que continúes tu viaje como desarrollador en TechCorp y más allá.