El script llamado por .bashrc con "salir" impide el inicio de sesión

El script llamado por .bashrc con "salir" impide el inicio de sesión

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, exitme 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 ifdeclaración agregando una elsedeclaració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 ifdeclaraciones 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, exitsaldrá de ese intérprete.

Si solo desea ejecutar el script como un programa separado, no use source: solo ~/myscript.shlo ejecutará si primero lo hace ejecutable con chmod +x ~/myscript.sh, o puede usarlo bash ~/myscript.shsi 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 sourcesu script (porque, por ejemplo, va a establecer variables de entorno), puede dejar de ejecutar el resto del archivo sin afectar .bashrcel shell que lo ejecutó.usandoreturn:

returnTambién se puede utilizar para finalizar la ejecución de un script que se está ejecutando con el comando incorporado .( source), devolviendo ya seano el estado de salida del último comando ejecutado dentro del script como estado de salida del script

En ese caso, su myscript.sharchivo tendría:

if [[ condition ]]
then
    return 0
fi

con el efecto que deseabas.

información relacionada