web-dev-qa-db-fra.com

Exécuter un script lors de la connexion en utilisant ~ / .bash_login

Je dois exécuter un script lorsque je me connecte et que je me déconnecte dans Ubuntu.

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

Existe-t-il un meilleur emplacement pour exécuter mon script?

Mon script se trouve dans /home/gsd/script/login.sh et est exécutable.

modifier:

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

maintenant, je n'ai plus que: touch /home/gsd/test.txt dans le ~/.bash_login à tester.

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

éditer 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
14
Gino Sullivan

Si .bash_profile existe, alors Bash ne lira pas .bash_login (ou .profile). Cette fonctionnalité gênante est décrite dans certaines versions du manuel Bash, mais pas dans sa totalité.

.bash_profile et .bash_login sont analogues, donc je vous recommande de mettre vos commandes dans .bash_profile, car il est couramment utilisé et .bash_login est relativement inconnu. Pensez également à placer vos commandes dans .bashrc au lieu de .bash_profile. Le manuel décrit la différence entre "Shell interactif sans connexion" et "Shell de connexion interactive", assurez-vous donc de lire cette section.

Le GNU Manuel de référence de Bash version 4.1: fichiers de démarrage de Bash dit:

recherche ~/.bash_profile, ~/.bash_login et ~/.profile, dans cet ordre, 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 , puisque vous dites que vous n'avez pas de fichier .bash_profile.

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

Pour tester cela, ajoutez quelque chose comme suit dans chaque fichier: .bashrc, .bash_profile et .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Puis déconnectez-vous et reconnectez-vous. Lorsque vous vous connectez, je parie que vous ne verrez que la phrase "DEBUG: je suis .bashrc" mais pas "je suis .bash_profile". Si c'est le cas, cela signifie que vous êtes un "shell interactif sans connexion", ce qui signifie simplement que Bash appellera .bashrc mais pas .bash_profile. Pour savoir pourquoi ces fichiers sont ce qu'ils sont, voir le message de @Andrejs Cainikovs ci-dessous et http://mywiki.wooledge.org/DotFiles

20
Stefan Lasiewski

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

Coques interactives lire et exécuter .bashrc.

Vous verrez souvent que /etc/profile sources .bashrc - ainsi, tous les paramètres définis dans .bashrc prendront également effet dans un shell de connexion, qu’il soit interactif ou non.

L'ordre d'exécution des scripts d'initialisation pour un shell dépend du type de shell, qu'il soit interactif ou non, et non lié à un script de connexion.

Lorsque bash est appelé en tant que shell de connexion interactif, il lit et exécute les commandes à partir du /etc/profile. Ensuite, Bash essaiera d’exécuter UNIQUEMENT le premier fichier existant et est 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, une erreur sera générée. Il n'y a pas d'erreur s'il y en a NOT trouvé.

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

5
jwilleke

Bash ne cherche que les fichiers .bash_login ou .profile s'il est exécuté en tant que shell de connexion interactif. Lorsqu'il est exécuté en tant que shell interactif sans connexion, il se lit .bashrc.
Généralement, il s’agit du deuxième cas, c’est-à-dire que lorsque vous exécutez gnome-terminal bash est exécuté en tant que shell sans connexion.

Cela indique clairement que si vous démarrez dans Gnome, .bash_login ne sera pas exécuté. Mais si vous baissez le niveau d'exécution pour démarrer directement sur bash, le même fichier sera exécuté lors d'une connexion réussie.
Je suppose que .bash_login sera également exécuté dans le cas de connexions SSH distantes.

Partiellement arraché de ici .

0
Andrejs Cainikovs

Assurez-vous que le script que vous voulez exécuter est exécutable. Exécutez chmod +x scriptname pour le faire. Assurez-vous également que le script commence par le Shebang correct (#!/bin/bash pour les scripts Shell). Enfin, utilisez tous les chemins complets lors de l’exécution, par exemple, /usr/bin/echo au lieu de echo simplement en cas que l’environnement dans lequel votre script sera exécuté n’est pas identique à celui auquel vous êtes habitué.

0
Huckle