
Me sorprendí; No pude iniciar sesión en root después de crear un script y llamarlo desde ~/.bashrc
.
~/.bashrc:
#... do stuff then run my script
source ~/myscript.sh
~/miscript.sh:
#!/bin/bash
if [myConditional]; then
exit
fi
# otherwise do stuff
Lo que esperaba era que cuando iniciara sesión como root, se ejecutara myscript.sh, y si myConditional fuera verdadero, myscript.sh dejaría de ejecutar más comandos, pero regresaría a .bashrc y el usuario aún estaría conectado. como root como de costumbre. ¡Pero en cambio, exit
me impidió poder iniciar sesión! Simplemente me devolvió a un mensaje de inicio de sesión.
¿Hay otro comando que debería usar además exit
? Obviamente, podría ampliar la if
declaración agregando una else
declaración y eliminándola exit
, pero con fines educativos me gustaría saber si existe un enfoque más apropiado. (También en parte porque quiero evitar if
declaraciones profundamente anidadas; podría ser un guión bastante grande)
Respuesta1
source filename.sh
(o . filename.sh
) ejecuta el contenido defilename.sh
en el intérprete actual(esencialmente, como si hubieras copiado el contenido en ese momento). En consecuencia, exit
saldrá de ese intérprete.
Si solo desea ejecutar el script como un programa separado, no use source
: solo ~/myscript.sh
lo ejecutará si primero lo hace ejecutable con chmod +x ~/myscript.sh
, o puede usarlo bash ~/myscript.sh
si lo prefiere. Eso inicia un nuevo shell para ejecutar su script, como si fuera cualquier otro programa en el sistema.
Por otro lado, si realmente le importa source
su script (porque, por ejemplo, va a establecer variables de entorno), puede dejar de ejecutar el resto del archivo sin afectar .bashrc
el shell que lo ejecutó.usandoreturn
:
return
También se puede utilizar para finalizar la ejecución de un script que se está ejecutando con el comando incorporado.
(source
), devolviendo ya sean
o el estado de salida del último comando ejecutado dentro del script como estado de salida del script
En ese caso, su myscript.sh
archivo tendría:
if [[ condition ]]
then
return 0
fi
con el efecto que deseabas.