Führen Sie beim Anmelden ein Skript mit ~ / .bash_login aus


14

Ich muss ein Skript ausführen, wenn ich mich in meinem Ubuntu an- und abmelden möchte.

Ich habe versucht, das Skript in mein zu setzen, ~/.bash_loginaber es hat nicht funktioniert.

Gibt es einen besseren Ort, an dem ich mein Skript ausführen kann?

Mein Skript befindet sich in /home/gsd/script/login.shund ist ausführbar.

bearbeiten:

Mein Skript wird ausgeführt, wenn ich tippe: /home/gsd/script/login.shund es wird mit + x gesetzt

jetzt habe ich nur noch: touch /home/gsd/test.txtim ~/.bash_logintest.

Die Datei test.txt wird nie erstellt

2 bearbeiten:

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

Hat .bash_login die richtigen Berechtigungen? Was gibt ls -l .bash_login zurück?
Santiagozky

Hast du auch eine ~/.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
Es ist nicht erforderlich, chmod +x .bash_logindas ausführbare Bit auf .bash_login zu setzen. Das Bash-Handbuch ist in diesem Bereich etwas verwirrend, aber Bash führt .bash_login nicht wie ein Shell-Skript aus. Es liest die Datei und führt dann die darin enthaltenen Befehle aus (Sie können etwas Ähnliches tun, indem Sie ausführen source ~/.bash_login).
Stefan Lasiewski

Antworten:


20

Wenn .bash_profile vorhanden ist, liest Bash nicht .bash_login (oder .profile). Diese nervige Funktion wird in einigen Versionen des Bash-Handbuchs beschrieben, jedoch nicht in allen.

.bash_profileund .bash_loginsind analog, daher empfehle ich Ihnen, Ihre Befehle einzugeben .bash_profile, da es häufig verwendet wird und .bash_loginrelativ unbekannt ist. Ziehen Sie auch in Betracht, Ihre Befehle .bashrcanstelle von einzugeben .bash_profile. Das Handbuch beschreibt den Unterschied zwischen "Interactive Non-Login Shell" und "Interactive Login Shell". Lesen Sie daher unbedingt diesen Abschnitt.

Das GNU Bash Referenzhandbuch Version 4.1: Bash Startup Files sagt:

sucht in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von dem ersten aus, der vorhanden und lesbar ist.

Siehe auch diese Frage zum Superuser und dieses Bash-Howto .

Aktualisieren Sie , da Sie sagen, dass Sie kein .bash_profile haben.

Es hört sich so an, als würden Sie keine so genannte "interaktive Shell ohne Anmeldung" verwenden (eine ausführliche Beschreibung finden Sie im Bash-Handbuch).

Um dies zu testen, fügen Sie so etwas wie die folgenden jede Datei: .bashrc, .bash_profileund .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Melden Sie sich dann ab und wieder an. Wenn Sie sich einloggen, werden Sie bestimmt nur den Satz "DEBUG: Ich bin .bashrc" sehen, aber nicht "Ich bin .bash_profile". Wenn ja, bedeutet dies, dass Sie eine "interaktive Shell ohne Anmeldung" sind, was einfach bedeutet, dass Bash aufruft, .bashrcaber nicht .bash_profile. Informationen dazu, warum diese Punktedateien so sind, finden Sie in @Andrejs Cainikovs 'Post unten und unter http://mywiki.wooledge.org/DotFiles


Ich habe meine Frage aktualisiert, ich habe kein bash_profile
Gino Sullivan

Ok, weil du vorhin gesagt hast "Ja, ich habe ein Bash-Profil".
Stefan Lasiewski

Ja, ich hatte es dann entfernt, aber die gleichen Ergebnisse
Gino Sullivan

3
Diese Antwort löst das Problem, ich denke, es lohnt sich, sie anzunehmen.
Marius Butuc

1
Beachten Sie auch, dass diese Bash-Dateien nur beim Anmelden an einer Shell (über Terminal, ssh usw.) ausgeführt werden, nicht beim Anmelden an der GUI!
mivk

5

Login-Shells, egal ob sie interaktiv oder nicht interaktiv sind, lesen und führen die aus.profile

Interaktive Shells lesen und ausführen .bashrc.

Oft werden Sie feststellen, dass /etc/profileQuellen .bashrc- daher werden alle in vorgenommenen Einstellungen .bashrcauch in einer Anmeldeshell wirksam, unabhängig davon, ob diese interaktiv oder nicht interaktiv ist.

Die Reihenfolge der Ausführung der Initialisierungsskripts für eine Shell hängt davon ab, ob die Shell interaktiv oder nicht interaktiv ist und ob es sich um ein Anmeldeskript handelt oder nicht.

Wenn bash als interaktive Anmeldeshell aufgerufen wird , liest es Befehle aus der /etc/profile. Dann wird Bash versuchen, NUR die erste Datei auszuführen, die existiert und folgende Informationen enthält:

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

Wenn eine dieser Dateien gefunden wird, aber nicht gelesen werden kann, wird ein Fehler verursacht. Es liegt kein Fehler vor, wenn KEINE gefunden wurden.

Der gleiche Vorgang wird ausgeführt, wenn eine nicht interaktive Anmeldeshell mit der --loginOption aufgerufen wird .


1
AFAIK, .profileDatei wird nur gelesen und ausgeführt, wenn sich der Benutzer über die grafische Oberfläche anmeldet. Sonst wird es nicht gelesen.
RajaRaviVarma

@RajaRaviVarma Ich habe es gerade getestet (Ubuntu 16.04) und es wird ~/.profiledefinitiv in nicht-grafischen Login-Shells gelesen (ich habe es getestet, indem ich zu einem anderen Terminal gewechselt habe und mich dort angemeldet habe Ctrl+Alt+F2).
Waldyrious

Ich stimme @RajaRaviVarma zu - Ich logge mich über SSH in eine Ubuntu 16.04 VM ein und .profilekann nur gelesen werden.bashrc
jamesc

0

Stellen Sie sicher, dass das Skript, das Sie ausführen möchten, ausführbar ist. Führen chmod +x scriptnameSie das aus. Stellen Sie außerdem sicher, dass das Skript mit dem richtigen Shebang startet ( #!/bin/bashfür Shell-Skripte). Verwenden Sie zum Schluss alle vollständigen Pfade, wenn Sie es ausführen, z. B. /usr/bin/echoanstatt echonur die Umgebung einzuschalten, in der Ihr Skript ausgeführt wird, ist nicht identisch mit der, die Sie gewohnt sind.


0

Bash sucht nur nach .bash_loginoder .profileDateien, wenn es als interaktive Login-Shell ausgeführt wird. Wenn es als interaktive Nicht-Login-Shell ausgeführt wird, liest es .bashrc.
In der Regel ist es der zweite Fall, dh wenn Sie gnome-terminalbash ausführen, wird es als Nicht-Login-Shell ausgeführt.

Dies besagt eindeutig, dass Gnome beim Booten .bash_loginnicht ausgeführt wird. Wenn Sie jedoch den Runlevel senken, um direkt mit bash zu booten, wird dieselbe Datei nach erfolgreicher Anmeldung ausgeführt.
Ich gehe davon aus .bash_login, dass es auch bei entfernten SSH-Verbindungen ausgeführt wird.

Teilweise von hier abgerissen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.