Exécutez un script lors de la connexion à l'aide de ~ / .bash_login


15

Je dois exécuter un script lorsque je me connecte et me déconnecte sur mon Ubuntu.

J'ai essayé de mettre le script dans mon ~/.bash_loginmais cela n'a pas fonctionné.

Existe-t-il un meilleur emplacement où je peux exécuter mon script?

Mon script se trouve dans /home/gsd/script/login.shet il est exécutable.

Éditer:

mon script s'exécute lorsque je tape: /home/gsd/script/login.shet il est défini avec + x

maintenant, je n'ai que: touch /home/gsd/test.txtdans le ~/.bash_logintest.

le fichier test.txt n'est jamais créé

modifier 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

est-ce que .bash_login a les bonnes autorisations? que renvoie ls -l .bash_login?
santiagozky

En avez-vous également un ~/.bash_profile?
enzotib

-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
Gino Sullivan

1
chmod +x .bash_login
Zoke

1
Il n'est pas nécessaire de chmod +x .bash_login(définir le bit exécutable sur .bash_login). Le manuel de Bash est un peu déroutant dans ce domaine, mais Bash n'exécute pas .bash_login comme un script shell. Il lit le fichier puis exécute les commandes qu'il contient (vous pouvez faire quelque chose de similaire en exécutant source ~/.bash_login).
Stefan Lasiewski

Réponses:


20

Si .bash_profile existe, Bash ne lira pas .bash_login (ou .profile). Cette fonctionnalité ennuyeuse est décrite dans certaines versions du manuel Bash, mais pas toutes.

.bash_profileet .bash_loginsont analogues, donc je vous recommande de mettre vos commandes .bash_profile, car elles sont couramment utilisées et .bash_loginrelativement inconnues. Pensez également à mettre vos commandes à la .bashrcplace de .bash_profile. Le manuel décrit la différence entre «shell interactif sans connexion» et «shell de connexion interactif», alors assurez-vous de lire cette section.

Le manuel de référence GNU Bash version 4.1: Fichiers de démarrage Bash dit:

recherche ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre, et lit et exécute les commandes de la première qui existe et est lisible.

Voir aussi cette question sur le superutilisateur , et ce howto Bash (Ne vous laissez pas décourager par l'adresse freeunix.dyndns.org:8088 --- c'est toujours un manuel de bonne qualité et je l'utilise depuis des années).

Mettez à jour , car vous dites que vous n'avez pas de .bash_profile.

Il semble que vous n'utilisiez pas ce qu'on appelle un "shell interactif sans connexion" (voir le manuel Bash pour une description détaillée).

Pour tester cela, ajouter quelque chose comme chaque fichier suivant: .bashrc, .bash_profileet .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Déconnectez-vous ensuite et reconnectez-vous. Lorsque vous vous connectez, je parie que vous ne verrez que la phrase "DEBUG: I am .bashrc" mais pas "I am .bash_profile". Si c'est le cas, cela signifie que vous êtes un "shell interactif sans connexion", ce qui signifie simplement que Bash appellera .bashrcmais pas .bash_profile. Pour plus d'informations sur la raison pour laquelle ces fichiers dot sont tels qu'ils sont, voir le post de @Andrejs Cainikovs ci-dessous et http://mywiki.wooledge.org/DotFiles


j'ai mis à jour ma question, je n'ai pas de bash_profile
Gino Sullivan

D'accord, parce que plus tôt vous avez dit "oui j'ai un profil bash".
Stefan Lasiewski

oui, je l'ai ensuite retiré mais les mêmes résultats
Gino Sullivan

3
Cette réponse résout le problème, je pense que cela vaut la peine de l'accepter.
Marius Butuc

1
Notez également que ces fichiers bash ne sont exécutés que lors de la connexion à un shell (via Terminal, ssh, etc.), pas lors de la connexion à l'interface graphique!
mivk

6

Les shells de connexion, qu'ils soient interactifs ou non interactifs, lisent et exécutent le.profile

Les shells interactifs lisent et s'exécutent .bashrc.

Souvent, vous verrez que les /etc/profilesources .bashrc- ainsi, tous les paramètres définis dans .bashrcprendront également effet dans un shell de connexion, qu'il soit interactif ou non interactif.

L'ordre d'exécution des scripts d'initialisation pour un shell dépend si le shell est interactif ou non interactif et n'est pas lié à s'il s'agit d'un script de connexion ou non.

Lorsque bash est invoqué en tant que shell de connexion interactif, il lit et exécute des commandes à partir du /etc/profile. Ensuite, Bash essaiera afin d'exécuter UNIQUEMENT le premier fichier existant et lisible comme suit:

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

Si l'un de ces fichiers est trouvé mais ne peut pas être lu, il provoquera une erreur. Il n'y a pas d' erreur si aucune sont pas trouvées.

Ce même processus est suivi lorsqu'un shell de connexion non interactif est appelé avec l' --loginoption.


1
AFAIK, le .profilefichier est lu et exécuté uniquement lorsque l'utilisateur se connecte à l'aide de l'interface graphique. Sinon, il n'est pas lu.
RajaRaviVarma

@RajaRaviVarma Je viens de tester (Ubuntu 16.04) et je suis ~/.profiledéfinitivement lu dans des shells de connexion non graphiques (j'ai testé en passant à un autre terminal via Ctrl+Alt+F2et en me connectant).
waldyrious

Je suis d'accord avec @RajaRaviVarma - Je me connecte à une machine virtuelle Ubuntu 16.04 via SSH et .profilen'est pas lu, seulement.bashrc
jamesc

0

Assurez-vous que le script que vous souhaitez exécuter est exécutable. Courez chmod +x scriptnamepour faire ça. Assurez-vous également que le script commence par le bon shebang ( #!/bin/bashpour les scripts shell). Enfin, utilisez tous les chemins d'accès complets lors de son exécution, par exemple, /usr/bin/echoau lieu d' echoincase simplement l'environnement dans lequel votre script s'exécutera n'est pas identique à celui auquel vous êtes habitué.


0

Bash recherche uniquement .bash_loginou .profilefichiers si elle est exécutée comme shell interactif de connexion. Lorsqu'il est exécuté en tant que shell non connexion interactive , il se lit comme suit .bashrc.
Généralement, c'est le deuxième cas, c'est-à-dire lorsque vous exécutez gnome-terminalbash est exécuté en tant que shell sans connexion.

Cela indique clairement que si vous démarrez dans Gnome, .bash_loginne sera pas exécuté. Mais si vous diminuez le niveau d'exécution pour démarrer directement vers bash, le même fichier sera exécuté lors de la connexion réussie.
Je suppose que .bash_loginsera également exécuté en cas de connexions SSH distantes.

Partiellement arraché d' ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.