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
- Ejecutar el script sin permiso
xusandobash hola.sh. Funciona porque ahí esbashquien lee el archivo, no el sistema quien lo ejecuta. - Mover el script a
~/biny ejecutarlo escribiendo solohola.sh. Requiere entender el PATH. - Crear un segundo script, hacerle commit y ver su modo con
git ls-files --stage. - Quitar el permiso
rconchmod -r hola.she intentarcat hola.sh.
Ejercicio integrador
- Crear
info.shcon shebang que escriba enreporte.txtel usuario, la fecha y la salida dedf -h, usando>la primera vez y>>después. - Darle permisos
750y verificar conls -l. - Moverlo a
~/bin, agregar~/binal PATH y ejecutarlo escribiendo soloinfo.sh. - Usar
type info.shywhich info.shpara confirmar de dónde sale. - Intentar ejecutarlo con otro usuario y explicar por qué falla o funciona.
- Hacer commit y comprobar el modo
100755congit ls-files --stage.