Explorador
Práctica

Primer script y el shebang

Crear un script de bash, entender por qué falla sin permiso de ejecución y qué hace exactamente la línea del shebang.

Actualizado el

En esta guía

Crear el proyecto

mkdir -p ~/proyectos/mi-primer-script
cd ~/proyectos/mi-primer-script
git init

Crear el script

cat > hola.sh << 'EOF'
#!/bin/bash
echo "Hola, $USER"
echo "Hoy es: $(date)"
echo "Estás en: $(pwd)"
EOF

La primera línea, #!/bin/bash, es el shebang: indica con qué intérprete se ejecuta el archivo.

Ejecutarlo y verlo fallar

./hola.sh
bash: ./hola.sh: Permission denied

El archivo se creó sin permiso de ejecución (x). Por seguridad, Linux no ejecuta nada que no se haya autorizado explícitamente.

ls -l hola.sh        # -rw-r--r--

Dar permiso de ejecución

chmod +x hola.sh
ls -l hola.sh        # ahora: -rwxr-xr-x
./hola.sh            # funciona

chmod 755 hola.sh equivale a chmod +x en este caso. El detalle de cada modo está en la guía de permisos.

Qué hace el shebang

#! se lee “shebang” (hash + bang). Son los dos primeros bytes del archivo y le indican al kernel con qué programa interpretarlo.

#!/bin/bash              # usa exactamente este bash
#!/usr/bin/env bash      # busca bash en el PATH (más portable)
#!/usr/bin/env python3   # sirve para cualquier lenguaje

Al ejecutar ./hola.sh, el kernel lee esos bytes y lanza /bin/bash ./hola.sh. Si el archivo no los tiene y se ejecuta desde bash, este lo corre con sí mismo como respaldo, pero no es confiable.

Fuera de la primera línea, # es un comentario, y por eso el shebang no estorba al lenguaje.

El intérprete puede ser cualquier programa

printf '#!/bin/cat\nEste archivo se imprime solo\n' > truco.sh
chmod +x truco.sh && ./truco.sh

Imprime su propio contenido, porque el “intérprete” es cat. El shebang solo elige qué programa recibe el archivo.

Con otro lenguaje

cat > saludo.py << 'EOF'
#!/usr/bin/env python3
print("Hola desde Python")
EOF
chmod +x saludo.py && ./saludo.py

Primer commit

git status                    # hola.sh aparece como "untracked"
git add hola.sh
git commit -m "Agrega script hola.sh"
git log --oneline

Git también guarda el permiso de ejecución

git ls-files --stage
100755 e69de29... 0 hola.sh

100755 indica archivo ejecutable. Uno normal sería 100644.

chmod -x hola.sh
git diff
old mode 100755
new mode 100644

Git detecta que cambió el permiso aunque el contenido sea idéntico. Se restaura con chmod +x hola.sh o git restore hola.sh.

Ejercicios

  1. Ejecutar el script sin permiso x usando bash hola.sh. Funciona porque ahí es bash quien lee el archivo, no el sistema quien lo ejecuta.
  2. Mover el script a ~/bin y ejecutarlo escribiendo solo hola.sh. Requiere entender el PATH.
  3. Crear un segundo script, hacerle commit y ver su modo con git ls-files --stage.
  4. Quitar el permiso r con chmod -r hola.sh e intentar cat hola.sh.

Ejercicio integrador

  1. Crear info.sh con shebang que escriba en reporte.txt el usuario, la fecha y la salida de df -h, usando > la primera vez y >> después.
  2. Darle permisos 750 y verificar con ls -l.
  3. Moverlo a ~/bin, agregar ~/bin al PATH y ejecutarlo escribiendo solo info.sh.
  4. Usar type info.sh y which info.sh para confirmar de dónde sale.
  5. Intentar ejecutarlo con otro usuario y explicar por qué falla o funciona.
  6. Hacer commit y comprobar el modo 100755 con git ls-files --stage.