El shell es un componente fundamental del sistema operativo Linux, esencial para interactuar con el sistema y automatizar tareas. Es el lenguaje principal para la administración del sistema y el desarrollo de scripts, permitiendo ejecutar comandos, utilizar herramientas de Linux y crear programas complejos sin necesidad de una interfaz gráfica. Incluso la línea de comandos de Windows tiene sus raíces en el concepto de shell.
Conceptos Básicos del Shell
Un programa ejecutado por el shell se conoce comúnmente como un script. Estos scripts son secuencias de comandos de shell empaquetados que se ejecutan de forma completa, en lugar de paso a paso. Generalmente se eejcutan utilizando bash o sh. Puedes verificar la versión del shell de tu sistema con comandos específicos.
Redirección y Tuberías
Antes de profundizar en la sintaxis básica, es crucial entender cómo manejar la entrada y salida de los programas en Linux, incluidos los scripts de shell.
Redirección de Salida
La redirección permite modificar el destino de la salida estándar (stdout) o de la salida de error estándar (stderr) de un comando.
Por ejemplo, el comando:
ls -l > archivos_lista.txt
Guarda el resultado del comando ls -l en el archivo archivos_lista.txt. El operador > redirige la salida estándar (lo que normalmente se vería en la pantalla) al archivo especificado. Si el archivo ya existe, su contenido será sobrescrito.
Para añadir la salida al final de un archivo existente, se utiliza el operador >>:
ls -l >> archivos_lista.txt
Los comandos en shell pueden recibir parámetros conocidos como descriptores de archivo. Los más comunes son:
0: Entrada estándar (stdin)1: Salida estándar (stdout)2: Salida de error estándar (stderr)
Todos estos pueden ser redirigidos. Consideremos los siguientes ejemplos:
kill -HUP 1234 > salida_kill.txt 2> error_kill.txt
kill -1 1234 > salida_completa_kill.txt 2>&1
El primer comando intenta terminar el proceso con ID 1234, redirigiendo la salida normal a salida_kill.txt y cualquier error a error_kill.txt. El segundo comando redirige tanto la salida estándar como la salida de error al mismo archivo salida_completa_kill.txt. La sintaxis 2>&1 indica que el descriptor de archivo 2 (stderr) debe apuntar a la misma ubicación que el descriptor de archivo 1 (stdout).
Redirección de Entrada
La entrada de un comando también puede ser redirigida desde un archivo. Por ejemplo:
more < mi_archivo.txt
Este comando utiliza el contenido de mi_archivo.txt como entrada para el comando more.
Tuberías (Pipes)
Las tuberías son una característica potente del shell que permiten conectar la salida de un comando a la entrada de otro. Los procesos conectados por una tubería pueden ejecutarse concurrentemente, y el flujo de datos se maneja automáticamente.
Sin tuberías, ordenar la salida de ps requeriría pasos intermedios:
ps > temp_ps.txt
sort temp_ps.txt > ps_ordenado.txt
Utilizando una tubería, el proceso se simplifica:
ps | sort > ps_ordenado.txt
La salida del comando ps se dirige directamente a la entrada del comando sort, y el resultado final se guarda en ps_ordenado.txt.
También es posible encadenar múltiples comandos para procesar la información directamente en la pantalla:
ps | sort | more
No hay límite en la cantidad de comandos que se pueden conectar en una tubería. El siguiente comando lista todos los procesos, los ordena, elimina duplicados y excluye los procesos del shell (sh) antes de mostrarlos en pantalla:
ps -xo comm | sort | uniq | grep -v sh | more
Precaución con las tuberías y la redirección: Evita usar el mismo nombre de archivo tanto para la entrada como para la salida en una secuencia de tubería con redirección de salida (>). Por ejemplo:
cat datos.txt | sort > datos.txt
Este comando resultará en un archivo datos.txt vacío. Esto ocurre porque el operador >, al ejecutarse, primero vacía el archivo datos.txt. Luego, cat intenta leer de un archivo vacío, y el resultado vacío se escribe de vuelta en datos.txt.
Creación y Ejecución de Scripts
Creación de un Script
Un script es simplemente un archivo de texto que contiene comandos de shell. Aquí tienes un ejemplo de un script interactivo que busca archivos que contienen la cadena "include":
#!/bin/bash
for archivo in *
do
if grep -q "include" "$archivo"
then
echo "$archivo"
fi
done
exit 0
La línea #!/bin/bash (conocida como shebang) especifica el intérprete que debe ejecutar el script. El comando exit 0 indica que el script finalizó exitosamente, similar a return en C. Este código de salida es útil cuando un script llama a otro, permitiendo verificar si la ejecución fue correcta.
Ejecución de un Script
Para ejecutar un script, puedes invocar directamente el intérprete:
bash nombre_del_script.sh
Alternativamente, puedes hacer el script ejecutable modificando sus permisos:
chmod +x nombre_del_script.sh
Una vez que el script es ejecutable, puedes llamarlo directamente desde el directorio actual usando:
./nombre_del_script.sh
Si el comando no se encuentra, puede ser necesario ajustar la variable de entorno PATH para incluir el directorio actual o el directorio donde se encuentra el script.