Pesquisa de site

Você não pode usar logout em um script Bash, então use estas soluções alternativas


Principais conclusões

  • O comando logout do Linux não funciona em scripts porque eles são executados em shells que não são de login.
  • Em um shell de login em um console, você pode usar o comando exec para iniciar o script e será desconectado quando ele terminar.
  • Os métodos alternativos incluem usar source ou anexar o comando logout à linha de comando.

O comando de logout do Linux não funciona em scripts Bash. É raro, mas, ocasionalmente, você pode precisar dessa funcionalidade. Aqui estão três maneiras de contornar o problema e sair de um script.

Por que o logout não funciona em scripts

Existem shells de login e shells sem login. O primeiro shell criado quando você faz login é um shell de login. Todos os outros shells não são shells de login. As diferenças entre os dois tipos de shell decorrem dos diferentes arquivos de sistema que são lidos pelo shell à medida que ele é criado.

Claramente, você não pode sair de um shell sem login. Se um shell não tiver o conceito de login, ele não poderá desconectar você.

Os scripts de shell não são executados no shell a partir do qual foram iniciados. Um novo shell é gerado para eles serem executados. Mesmo que tenham sido iniciados a partir de um shell de login, eles não são executados em um shell de login.

Podemos ver isso com bastante facilidade. Este é o prompt de login de um computador rodando Arch Linux, sem nenhum ambiente gráfico de desktop instalado. Está usando o shell Bash. Eu fiz login e estou prestes a pressionar Enter no comando de logout.

logout

Como seria de esperar, sou levado de volta ao prompt de login.

Evidentemente, o shell que estou usando é um shell de login. Vamos fazer login novamente e verificar o conteúdo de um script chamado lo.sh. Então vamos executá-lo.

cat lo.sh
./lo.sh

Bash reclama que não podemos usar o logout em um shell que não seja de login. Mesmo que nosso script tenha sido definitivamente iniciado a partir de um shell de login, ele não funciona. Não estamos desconectados.

Nem funcionará em uma janela de emulador de terminal em um computador com ambiente de área de trabalho gráfico. Neste caso, é o Ubuntu com a área de trabalho GNOME.

logout

Eu disse que você só tem um único shell de login. Esse não é estritamente o caso. Existem cenários em que você pode ter mais de um shell de login em execução no seu computador, mas você só tem um único shell de login por instância de usuário.

Cada usuário precisa de seu próprio shell de login para poder fazer login e logout. É possível fazer login no mesmo computador, mais de uma vez, como o mesmo usuário. Se você tiver SSH configurado em seu computador para suportar acesso remoto, poderá fazer login novamente por SSH, em seu computador local, por meio de uma janela de terminal.

ssh dave@localhost
who
logout
who

Depois de fazer login, executamos o comando who para listar os usuários atuais, depois efetuamos logout e executamos who novamente. Podemos ver que tivemos temporariamente um usuário extra. Esse usuário tem seu próprio shell de login. Mas isso não nos ajuda com o nosso cenário. Eles são os únicos usuários que podem acessar esse shell e verão o mesmo comportamento que acabamos de ver.

Como sair usando exec

Portanto: logout deve ser usado em um shell de login, mas nosso script não será executado em um shell de login, mesmo se for iniciado a partir de um.

O que podemos fazer é lançar nosso script com exec. Isso não segue o processo normal de criação de um shell para executar o script. Ele substitui o shell atual pelo comando que o exec inicia. A casca é descartada. Quando o comando termina, ele não pode voltar para o shell agora inexistente. Se fizermos isso a partir de um shell de login, seremos desconectados.

Precisamos de um script para experimentar. Copie este script trivial para o seu editor favorito e salve-o como "lo.sh".

#!/bin/bash
logout

Usaremos chmod para torná-lo executável.

chmod +x lo.sh

O script falha com a mensagem de erro agora familiar:

./lo.sh

Se o iniciarmos com exec, a janela do terminal será fechada quando o script parar de ser executado.

exec ./lo.sh

Claro, em nosso computador Arch somente console, não estamos usando um emulador de terminal. exec substitui nosso shell de login pelo script.

Quando o script termina, é apresentado um novo prompt de login. Portanto, funciona para logins de console em computadores Linux sem um ambiente gráfico de desktop instalado. Isso nos ajuda em nosso computador Ubuntu que executa o GNOME?

Sim, é verdade. No GNOME, podemos pressionar Ctrl+Alt+FnKey para abrir exatamente o mesmo tipo de tela inteira, console de login do shell. A FnKey pode ser de F3 a F6.

Podemos fazer login e usar o mesmo comando que usamos em nosso computador Arch.

exec lo.sh

Estamos desconectados e retornamos ao prompt de login do console. Pressionar Ctrl+Alt+F1 retorna à sua sessão do GNOME. Você precisará inserir sua senha para recuperar o acesso.

Observe que você retornou à sessão do GNOME do jeito que estava antes de pressionar Ctrl+Alt+F3. Sua sessão do GNOME não está desconectada, mas está protegida por senha.

Se você não quiser que o usuário da sessão do GNOME permaneça conectado, desconecte-o antes de executar o script. Você pode pressionar Ctrl+Alt+F3 na tela de login do Ubuntu, entrar no console e executar seu script.

Alguns pontos. Quando você usa exec assim, o comando logout no script é supérfluo. É o fato de o script ser encerrado sem nenhum shell para voltar que efetivamente desconecta você.

Você pode usar exit em vez de logout ou não usar nenhum dos comandos. Assim que o script terminar, você estará desconectado. Se você tiver ramificações de execução em seu script e ele puder terminar em locais diferentes, poderá usar exit para encerrar cada um dos possíveis caminhos de execução.

Outro problema é que, como você não está executando seu script dentro de um shell, você não tem acesso aos recursos do shell, como a expansão de curingas, nem aliases e funções do shell. Se o seu script precisar disso, você pode usar uma das outras técnicas abaixo.

Como sair usando a fonte

Usar o comando de origem do Linux interpreta os comandos dentro do seu script sem iniciar o script em um shell. Os comandos são interpretados pelo shell atual.

Abra uma janela de console como acima, usando Ctrl+Alt+F3, e use o comando source para interpretar os comandos em seu script.

source ./lo.sh

Você pode usar a palavra fonte ou um ponto final.

. ./lo.sh

Com esta técnica, você precisará sair ou sair do script. O encerramento do script por si só não desconectará você.

Como fazer logout usando uma função Bash

Existe uma maneira de executar qualquer script e fazer com que ele seja desconectado quando terminar, sem chamar logout ou sair do próprio script. Salve este script como simple.sh.

#!/bin/bash
echo "This script doesn't call any other commands."

Torne-o executável digitando:

chmod +x simple.sh

Em uma tela do console de login, adicione o comando logout após o nome do script. Separe o nome do script do comando de logout com ponto e vírgula.

./simple.sh; logout

Quando nosso script termina, estamos desconectados.

Se você fizer isso com frequência, seria conveniente criar uma pequena função Bash como esta.

run-logout () {
  $1; logout
}

Você pode chamar esta função e passar o nome de um script para ela. Ao fazer isso em um console de login, você será desconectado quando o script terminar.

run-logout simple.sh

Um resumo rápido

Se você deseja que um script seja executado até a conclusão na sua ausência e que o usuário seja desconectado quando ele for concluído, para que não haja nenhum usuário conectado, siga estas etapas.

  • Desconecte todos os usuários do computador.
  • Na tela de login do GNOME, pressione Ctrl+Alt+F3 para abrir uma janela do console de login.
  • Conecte-se.
  • Inicie seu script com um dos três métodos mostrados acima.