Ejecutar un script recién programado
Cuando escribimos un script y lo queremos ejecutar debemos hacer dos pasos, primero darle permisos de ejecución y luego escribir ./ y el nombre del script:
chmod +x script.sh ./script.sh
Si sólo programamos un script cada varios días puede ser llevadero, pero cuando programamos scripts cada día y muchos días varios scripts, puede llegar a ser tedioso tener que escribir el símbolo + y sobre todo la combinación de . y /
Como toda tarea repetitiva se puede automatizar y hacer que nuestro trabajo sea más cómodo. Podemos automatizar esta acción con:
#!/bin/bash chmod +x $1 ./$1
Este script funcionaría independientemente de si el fichero indicado como parámetro tiene o no permisos de ejecución. Pero sería más elegante sólo ejecutar el chmod si no tiene permisos de ejecución con:
[ -x $1 ] || chmod +x $1
Y, mejor aún, comprobar si el script ha recibido un fichero existente como parámetro:
if [ ! -f $1 ] || [ -z $1 ] then echo "Debe escribir un fichero para poder ejecutarlo." exit 1 fi
Por lo que el script nos quedaría así:
#!/bin/bash if [ ! -f $1 ] || [ -z $1 ] then echo "Debe escribir un fichero para poder ejecutarlo." exit 1 fi [ -x $1 ] || chmod +x $1 ./$1
En este punto nos encontraríamos con que no tendríamos que escribir el +x, pero seguiríamos teniendo la farragosa combinación ./, por lo que tendríamos que copiarlo a uno de los directorios de las rutas de ejecutables. Podemos saber estas rutas con:
echo $PATH
Lo más cómodo que podemos hacer es mirar si alguno de esos ficheros se encuentra en nuestra home y, si es así, copiarlo a ese directorio, por ejemplo, si con echo $PATH nos aparece algo como /home/usuario/.local/bin y hemos llamado al script execute, escribiremos:
cp execute /home/usuario/.local/bin
O, si le hemos llamado execute.sh:
cp execute.sh /home/usuario/.local/bin/execute
De esta manera, nos ahorramos tanto el escribir ./ como el .sh.
Editar y ejecutar
Ese script lo podemos acompañar con otro para editar el script y que lo ejecute automáticamente, generando una mayor optimización de tiempo y esfuerzo.
Podemos escribir al principio del script el nombre de nuestro editor de texto favorito o usar la variable de entorno $EDITOR para que sea más genérico y, de esa manera, al guardar el fichero, lo ejecutará.
#!/bin/bash if [ ! -f $1 ] || [ -z $1 ] then echo "Debe escribir un fichero para poder editarlo y ejecutarlo." exit 1 fi $EDITOR $1 [ -x $1 ] || chmod +x $1 ./$1
Y, si queremos ir un paso más en la automatización y evitar combinaciones complejas de teclas, podríamos incluso comprobar si el fichero no existe y añadirle el shebang en caso de que tenga una extensión .sh:
#!/bin/bash if [ -z $1 ] then echo "Debe escribir un fichero para poder editarlo." exit 1 elif [ ! -f $1 ] then if [ ${1#*.} = "sh" ] then echo "#!/bin/bash" > $1 echo "" >> $1 echo "" >> $1 fi fi $EDITOR $1 chmod +x $1 ./$1