Execute um script no login usando ~ / .bash_login

13

Eu preciso executar um script quando eu fizer login e logout no meu Ubuntu.

Eu tentei colocar o script no meu ~/.bash_login , mas não funcionou.

Existe uma localização melhor onde posso executar o meu script?

Meu script está localizado em /home/gsd/script/login.sh e é executável.

editar:

meu script é executado quando eu digito: /home/gsd/script/login.sh e é definido com + x

agora, só tenho: touch /home/gsd/test.txt no ~/.bash_login para testar.

o arquivo test.txt nunca é criado

edição 2:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc
    
por Gino Sullivan 25.01.2012 / 15:40

4 respostas

20

Se existir .bash_profile, o Bash não lerá .bash_login (ou .profile). Esse recurso irritante é descrito em algumas versões do manual do Bash, mas não em todas.

.bash_profile e .bash_login são análogos, então eu recomendo que você coloque seus comandos em .bash_profile , porque é comumente usado e .bash_login é relativamente desconhecido. Considere também colocar seus comandos em .bashrc em vez de .bash_profile . O manual descreve a diferença entre "shell interativo de não-login" e "shell de login interativo", portanto, leia essa seção.

O Manual de Referência do GNU Bash versão 4.1: Arquivos de Inicialização do Bash diz:

  

procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nesse   ordem, e lê e executa comandos do o primeiro que existe   e é legível.

Veja também esta pergunta no superusuário e < hash="http://freeunix.dyndns.org:8088/site2/howto/Bash.shtml"> este Bash howto (não se deixe intimidar pelo endereço freeunix.dyndns.org: 8088 - - ainda é um manual de boa qualidade e eu o uso há anos).

Atualizar , já que você diz que não tem um .bash_profile.

Parece que você não está usando o que é chamado de "shell interativo sem login" (consulte o manual do Bash para obter uma descrição detalhada).

Para testar isso, adicione algo como o seguinte em cada arquivo: .bashrc , .bash_profile e .bash_login .

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Em seguida, efetue logout e faça login novamente. Quando você logar, aposto que você só verá a frase "DEBUG: Eu sou .bashrc" mas não "Eu sou .bash_profile". Em caso afirmativo, significa que você é um "shell interativo de não-login", o que significa simplesmente que o Bash chamará .bashrc , mas não .bash_profile . Para saber por que esses arquivos de ponto são como são, veja a postagem de @Andrejs Cainikovs abaixo e o link

    
por Stefan Lasiewski 25.01.2012 / 23:11
4

Os shells de login, independentemente de serem interativos ou não-interativos lêem e executam o .profile

Shells interativos lêem e executam .bashrc .

Muitas vezes você verá que /etc/profile sources .bashrc - assim, todas as configurações feitas em .bashrc também terão efeito em um shell de login, independentemente de ele ser interativo ou não interativo.

A ordem de execução dos scripts de inicialização para um shell é dependente se o shell é interativo ou não interativo e não está relacionado a se é um script de login ou não.

Quando o bash é chamado como um login shell interativo , ele lê e executa comandos do /etc/profile . Em seguida, o Bash tentará, a fim de executar APENAS o primeiro arquivo, e poderá ler o seguinte:

  1. .bash_profile
  2. .bash_login
  3. .profile

Se um desses arquivos for encontrado, mas não puder ser lido, isso causará um erro. Não há erro se algum NÃO for encontrado.

Esse mesmo processo é seguido quando um shell de login não interativo é invocado com a opção --login .

    
por jwilleke 07.04.2016 / 16:39
0

Verifique se o script que você deseja executar é executável. Execute chmod +x scriptname para fazer isso. Certifique-se também de que o script inicie com o shebang correto ( #!/bin/bash para scripts de shell). Por fim, use todos os caminhos completos ao executá-lo, por exemplo, /usr/bin/echo em vez de echo apenas incase no ambiente em que seu script será executado não é idêntico àquele com o qual você está acostumado.

    
por Huckle 25.01.2012 / 19:58
0

O Bash só procura .bash_login ou .profile arquivos se ele for executado como um shell de login interativo. Quando ele é executado como um shell interativo de não-login, ele lê .bashrc .
Geralmente, é o segundo caso, ou seja, quando você executa gnome-terminal bash é executado como shell não-login.

Isso indica claramente que, se você estiver inicializando no Gnome, .bash_login não será executado. Mas se você diminuir o nível de execução para inicializar diretamente para o bash, o mesmo arquivo será executado após um login bem-sucedido.
Eu assumo .bash_login será executado no caso de conexões SSH remotas também.

Parcialmente copiado de aqui .

    
por Andrejs Cainikovs 26.01.2012 / 14:26