Script chamado por .bashrc com “exit” impede o log-in [duplicado]

1

Eu me peguei; Eu não consegui logar no root depois que fiz um script e o chamei de ~/.bashrc .

~ / .bashrc :

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

~ / myscript.sh :

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

O que eu esperava era que quando eu logasse como root, myscript.sh seria executado, e se myConditional fosse true, myscript.sh iria parar de rodar quaisquer outras vírgulas, mas retornaria para .bashrc e o usuário ainda assim estar logado como root como de costume. Mas, em vez disso, exit impediu que eu conseguisse fazer login! Apenas me retornou a um prompt de login.

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

    
por Jodes 26.09.2016 / 02:40

1 resposta

3

source filename.sh (ou . filename.sh ) executa o conteúdo de filename.sh no intérprete atual (essencialmente, como se você copiasse o conteúdo naquele ponto). Consequentemente, exit sairá desse intérprete.

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

Por outro lado, se você realmente quer dizer source do seu script (porque ele vai definir variáveis de ambiente, digamos), você pode parar de executar o resto do arquivo sem afetar .bashrc e o shell que executou usando return :

return may also be used to terminate execution of a script being executed with the . (source) builtin, returning either n or the exit status of the last command executed within the script as the exit status of the script

Nesse caso, seu arquivo myscript.sh teria:

if [[ condition ]]
then
    return 0
fi

com o efeito que você queria.

    
por 26.09.2016 / 03:16