Script chamado por .bashrc com “exit” impede login

Script chamado por .bashrc com “exit” impede login

Eu me peguei; Não consegui fazer login no root depois de criar um script e chamá-lo de ~/.bashrc.

~/.bashrc:

#... do stuff then run my script
source ~/myscript.sh

~/meuscript.sh:

#!/bin/bash
if [myConditional]; then
  exit
fi
# otherwise do stuff

O que eu esperava era que, quando eu fizesse login como root, myscript.sh fosse executado e, se myConditional fosse verdadeiro, myscript.sh parasse de executar quaisquer outros comandos, mas retornaria para .bashrc e o usuário ainda estaria logado como root, como de costume. Mas, em vez disso, exitimpediu-me de conseguir fazer login! Ele apenas me retornou a um prompt de login.

Existe outro comando que eu deveria usar além exit? Obviamente eu poderia simplesmente estender a ifdeclaração tendo uma elsedeclaração e removendo exit, mas para fins educacionais gostaria de saber se existe uma abordagem mais apropriada. (Também em parte porque quero evitar ifdeclarações profundamente aninhadas; pode ser um script bastante grande)

Responder1

source filename.sh(ou . filename.sh) executa o conteúdo defilename.sh no intérprete atual(essencialmente, como se você tivesse copiado o conteúdo naquele ponto). Conseqüentemente, exitsairá desse intérprete.

Se você deseja apenas executar o script como um programa separado, não use source: apenas ~/myscript.sho executará se você torná-lo executável primeiro com chmod +x ~/myscript.sh, ou você pode usar bash ~/myscript.shse preferir. Isso inicia um novo shell para executar seu script, como se fosse qualquer outro programa no sistema.

Por outro lado, se você realmente pretende usar sourceo seu script (porque ele definirá variáveis ​​de ambiente, por exemplo), poderá parar de executar o restante do arquivo sem afetar .bashrco shell que o executou.usandoreturn:

returntambém pode ser usado para encerrar a execução de um script que está sendo executado com o .( source) embutido, retornandonou o status de saída do último comando executado no script como o status de saída do script

Nesse caso, seu myscript.sharquivo teria:

if [[ condition ]]
then
    return 0
fi

com o efeito que você queria.

informação relacionada