Esegui uno script all'accesso usando ~ / .bash_login


14

Devo eseguire uno script quando eseguo il login e il logout sul mio Ubuntu.

Ho provato a inserire la sceneggiatura nel mio ~/.bash_loginma non ha funzionato.

C'è un posto migliore dove posso eseguire il mio script?

Il mio script si trova in /home/gsd/script/login.shed è eseguibile.

modificare:

il mio script viene eseguito quando scrivo: /home/gsd/script/login.she impostato con + x

ora ho solo: touch /home/gsd/test.txtnel ~/.bash_logintest.

il file test.txt non viene mai creato

modifica 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

.bash_login ha i permessi giusti? cosa restituisce ls -l .bash_login?
santiagozky,

Hai anche 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
Non è necessario chmod +x .bash_login(impostare il bit eseguibile su .bash_login). Il manuale di Bash è un po 'confuso in quest'area, ma Bash non esegue eXecute .bash_login come uno script di shell. Legge il file e quindi esegue i comandi al suo interno (puoi eseguire qualcosa di simile eseguendo source ~/.bash_login).
Stefan Lasiewski,

Risposte:


20

Se esiste .bash_profile, allora Bash non leggerà .bash_login (o .profile). Questa fastidiosa funzione è descritta in alcune versioni del manuale di Bash, ma non in tutte.

.bash_profilee .bash_loginsono analoghi, quindi ti consiglio di inserire i tuoi comandi .bash_profile, perché è comunemente usato ed .bash_loginè relativamente sconosciuto. Considera anche di inserire i tuoi comandi .bashrcanziché .bash_profile. Il manuale descrive la differenza tra "shell interattiva di non accesso" e "shell interattiva di accesso", quindi assicurati di leggere quella sezione.

Il Manuale di riferimento di GNU Bash versione 4.1: Bash Startup Files dice:

cerca ~ / .bash_profile, ~ / .bash_login e ~ / .profile, in questo ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile.

Vedi anche questa domanda su superutente , e questo Bash howto (Non scoraggiarti dall'indirizzo freeunix.dyndns.org:8088 --- è ancora un manuale di buona qualità e lo uso da anni).

Aggiorna , poiché dici di non avere un .bash_profile.

Sembra che tu non stia usando quella che viene chiamata "shell interattiva senza accesso" (vedi il manuale di Bash per una descrizione dettagliata).

Per verificare ciò, aggiungere qualcosa di simile a quanto segue ogni file: .bashrc, .bash_profilee .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Quindi disconnettersi e accedere nuovamente. Quando accedi, scommetto che vedrai solo la frase "DEBUG: I am .bashrc" ma non "I am .bash_profile". In tal caso, significa che sei una "shell interattiva non di accesso", il che significa semplicemente che Bash chiamerà .bashrcma non .bash_profile. Per informazioni sul motivo per cui questi dotfile sono come sono, vedere il post di @Andrejs Cainikovs di seguito e http://mywiki.wooledge.org/DotFiles


ho aggiornato la mia domanda, non ho un bash_profile
Gino Sullivan il

Ok, perché prima hai detto "sì, ho un profilo bash".
Stefan Lasiewski,

sì, l'ho fatto poi rimosso ma gli stessi risultati
Gino Sullivan,

3
Questa risposta risolve il problema, penso che valga la pena accettarlo.
Marius Butuc,

1
Si noti inoltre che questi file bash vengono eseguiti solo quando si accede a una shell (tramite Terminal, ssh, ecc.), Non quando si accede alla GUI!
mivk,

5

Shell di login, indipendentemente dal fatto che siano interattive o non interattive, leggi ed esegui il file.profile

Le shell interattive vengono lette ed eseguite .bashrc.

Spesso vedrai che le /etc/profilefonti .bashrc- quindi tutte le impostazioni effettuate .bashrcavranno effetto anche in una shell di login indipendentemente dal fatto che sia interattiva o non interattiva.

L'ordine di esecuzione degli script di inizializzazione per una shell dipende dal fatto che la shell sia interattiva o non interattiva e non sia correlata al fatto che si tratti di uno script di accesso o meno.

Quando bash viene invocato come shell di login interattiva , legge ed esegue i comandi da /etc/profile. Quindi Bash tenterà quindi di eseguire SOLO il primo file esistente ed è leggibile come segue:

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

Se uno di questi file viene trovato ma non può essere letto, si verificherà un errore. Non ci sono errori se NON ne vengono trovati.

Lo stesso processo viene seguito quando viene invocata una shell di login non interattiva con l' --loginopzione.


1
AFAIK, il .profilefile viene letto ed eseguito solo quando l'utente accede utilizzando l'interfaccia grafica. Altrimenti non viene letto.
RajaRaviVarma,

@RajaRaviVarma Ho appena testato (Ubuntu 16.04) e ~/.profilesicuramente viene letto in shell di accesso non grafiche (ho testato passando a un altro terminale Ctrl+Alt+F2e accedendo lì).
waldyrious

Sono d'accordo con @RajaRaviVarma - Sto accedendo a una Ubuntu 16.04 VM su SSH e .profilenon viene letto, solo.bashrc
jamesc

0

Assicurarsi che lo script che si desidera eseguire sia eseguibile. Corri chmod +x scriptnameper farlo. Assicurati anche che lo script inizi con lo shebang corretto ( #!/bin/bashper gli script di shell). Infine, usa tutti i percorsi completi quando lo esegui , ad esempio, /usr/bin/echoinvece di echoincasinare l'ambiente in cui verrà eseguito lo script non è identico a quello a cui sei abituato.


0

Bash cerca .bash_logino .profilefile solo se viene eseguito come shell di login interattiva. Quando viene eseguito come shell interattiva non di accesso, legge .bashrc.
Comunemente è il secondo caso, ovvero quando si esegue gnome-terminalbash viene eseguito come shell non di accesso.

Questo afferma chiaramente che se si avvia in Gnome, .bash_loginnon verrà eseguito. Ma se si abbassa il runlevel per eseguire l'avvio direttamente su bash, lo stesso file verrà eseguito al login riuscito.
Presumo .bash_loginche verrà eseguito anche in caso di connessioni SSH remote.

Parzialmente strappato da qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.