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
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
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:
.bash_profile
.bash_login
.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
.
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 .
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é.