[Gelöst] Debian-Weg um ~/.local/bin in PATH zu bekommen

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
buhtz
Beiträge: 1209
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

[Gelöst] Debian-Weg um ~/.local/bin in PATH zu bekommen

Beitrag von buhtz » 02.04.2022 04:53:45

Es geht darum ob ~/.local/bin in PATH ist. Das ist bspw. relevant für Python Pakete die per --editable installiert werden.

Ziel meines Postings ist es nicht nur eine konkrete technische Lösung zu finden, sondern den Hintergrund der Thematik und die Design Entscheidungen dahinter nachzuvollziehen.

Das Thema scheint auch nicht so neu zu sein. https://unix.stackexchange.com/q/316765/136851 verlinkt auch noch zu einem Debian bug der aber angeblich gefixet ist, wenn ich die Mails richtig interpretiere.

Wenn ich mich per SSH shell einlogge ist der Pfad vorhanden:
/home/user/.local/bin:/usr/local/bin:/u ... /usr/games

Lokal bzw. im Terminal-Emulator unter XFCE sieht es so aus:

Code: Alles auswählen

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Die ./profile entspricht dem Installationszustand

Code: Alles auswählen

diff /etc/skel/.profile $HOME/.profile
Diese Datei wird aber scheinbar nur per SSH shell oder einer echten tty-shell gelesen. Unter X bzw. dem Terminal-Emu (bei mir Debianterminator) ist das nicht der Fall.

Ist das von Debian gewünschtes Default Verhalten oder habe ich etwas falsch gemacht?
Wie würde man das am saubersten lösen? In welches Script muss das rein, oder muss ich irgendwo die .profile includieren?

EDIT: Das Debian hier zwischen "Login" und "Non-Login" unterscheidet, konnte ich natürlich bereits in den Kommentaren der Dateien nachlesen. Diese Begriffe habe ich aber nie verstanden. Wenn ich einen Benutzernamen und ein Passwort eingebe, ist das für mich immer ein Login; egal ob SSH, tty oder eine Terminal-Emulator.
Zuletzt geändert von buhtz am 27.04.2022 09:30:03, insgesamt 3-mal geändert.
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

DeletedUserReAsG

Re: Debian-weg um ~/.local/bin in PATH zu bekommen

Beitrag von DeletedUserReAsG » 02.04.2022 09:38:02

buhtz hat geschrieben: ↑ zum Beitrag ↑
02.04.2022 04:53:45
Diese Datei wird aber scheinbar nur per SSH shell oder einer echten tty-shell gelesen.
Nein, sie wird nur beim Login gelesen¹, wie’s auch direkt in der ersten Zeile darin zu lesen ist:

Code: Alles auswählen

# ~/.profile: executed by the command interpreter for login shells.
Was der „Debian-Weg“ ist, weiß ich nicht, aber ich hab meine allgemeinen Konfigurationen für die Bash in ~/.bashrc, wo sie bei jedem Starten der Bash gelesen werden:

Code: Alles auswählen

# ~/.bashrc: executed by bash(1) for non-login shells.
Wenn man dort gemachte Änderungen in der gleichen Shell haben möchte, kann man die Datei mit source explizit einlesen.

--
¹) wobei „Login“ hier beispielsweise auch ein entsprechender su-Aufruf sein kann

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Debian-Weg um ~/.local/bin in PATH zu bekommen

Beitrag von tobo » 02.04.2022 10:20:06

buhtz hat geschrieben: ↑ zum Beitrag ↑
02.04.2022 04:53:45
Wie würde man das am saubersten lösen? In welches Script muss das rein, oder muss ich irgendwo die .profile includieren?
Warum das mit ssh funktioniert und zur grundsätzlichen Begrifflichkeit kannst du erstmla hier lesen:
https://wiki.ubuntuusers.de/Shell/Modi/

Am saubersten löst man sowas wohl nicht in einer Shell-Konfigurationsdatei wie ~/.bashrc oder ~/.mkshrc, da jede Shell ihre eigene Konfigurationsdatei hat. Benutzt man verschiedene Shells, dann müsste man das also überall reinschreiben. Richtiger und shell-übergreifend ist also sowas wie ~/.profile. Jetzt muss man nur noch schauen, dass das gelesen wird. Das hängt dann von der entsprechenden Aufrufart ab, wo das konfiguriert werden muss - entweder im Terminal oder im Fenstermanager. Ich vermute mal, dass dein verwendetes Terminal eine Einstelllung mitbringt, die Shells grundsätzlich als Loginshells ausführt oder du sowas wie z.B. "xterm -ls" in der übergeordneten Umgebung setzen kannst.

buhtz
Beiträge: 1209
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

Re: Debian-Weg um ~/.local/bin in PATH zu bekommen

Beitrag von buhtz » 02.04.2022 11:37:45

Thats it. Danke.

Bei Terminator ist es im jeweiligen "Profil" unter "Befehl" die Option "Befehl in Login-Shell ausführen". Obwohl ich hier die Formulierung merkwürdig finde; müsste es nicht heißen: "Als Login-Shell ausführen". Was ist den hier der "Befehl"? Beim XFCE-Terminal heißt die Einstellung ähnlich.
tobo hat geschrieben: ↑ zum Beitrag ↑
02.04.2022 10:20:06
Warum das mit ssh funktioniert und zur grundsätzlichen Begrifflichkeit kannst du erstmla hier lesen:
https://wiki.ubuntuusers.de/Shell/Modi/
Das erklärt nur die technischen Unterschiede und Konsequenzen, aber nicht das Konzept dahinter. Ich forsche mal weiter...
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Debian-Weg um ~/.local/bin in PATH zu bekommen

Beitrag von smutbert » 02.04.2022 12:09:16

Ein frisch installiertes Debian hat als Teil des Pakets Debianbash die Datei »/etc/skel/.profile«, die jeder neu angelegte User als »~/.profile« bekommt und in der steht unter anderem

Code: Alles auswählen

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
In den meisten Fällen muss man also überhaupt nichts unternehmen, damit das in $PATH landet, außer vielleicht sich ab- und wieder anmelden, wenn das Verzeichnis gerade erst erstellt worden ist.
buhtz hat geschrieben: ↑ zum Beitrag ↑
02.04.2022 04:53:45
EDIT: Das Debian hier zwischen "Login" und "Non-Login" unterscheidet, konnte ich natürlich bereits in den Kommentaren der Dateien nachlesen. Diese Begriffe habe ich aber nie verstanden. Wenn ich einen Benutzernamen und ein Passwort eingebe, ist das für mich immer ein Login; egal ob SSH, tty oder eine Terminal-Emulator.
Es ist nicht immer dasselbe, da bin ich aber auch schon darüber gestolpert.
Meldest du dich auf der Textkonsole an, dann wird die Shell als login-Shell gestartet und »~/.profile« wird ausgeführt. Ob du dann eine Subshell startest oder eine andere nicht-Login-Shell startest, ändert daran in den meisten Fällen nichts, weil die Subshell oder die anderen Shell das bereits gesetzte $PATH übernimmt.

Über ssh erhält man ebenfalls eine Login-Shell, wenn ich mich jetzt gerade nicht füchterlich vertue.

Bei einer grafischen Anmeldung kann es gut sein, dass als erstes ein Skript, also auch eine Shell ausgeführt wird, deren Variablen, speziell $PATH, dann die weiters gestarteten Programme, also auch nicht-Login-Shells übernehmen. Dann gibt es kein Problem, weil die Shells der Terminalemulatoren, die normalerweise nicht als Login-Shells gestartet werden, die Variable einfach übernehmen.

Es kann aber auch sein, dass da etwas anderes gestartet wird und entweder »~/.profile« nie ausgeführt wird oder die Variablen wieder verloren gehen. Ein Beispiel dafür ist laut Dokumentation die Gnome Wayland Session [1]
Als Abhilfe kann man in den Einstellungen des Terminalemulators normalerweise festlegen, dass die Shell als Login-Shell gestartet werden soll, dann führt jede Terminal-Shell beim Start die »~/.profile« aus.
Manchmal will man aber auch dass $PATH für die ganze grafische Umgebung gilt, in deinem Fall könnte es z.B. sein, dass du willst, dass die Python-Programme auch von grafischen Programmen gefunden und ausgeführt können werden sollen und dann muss man sich eben etwas anderes zum Setzen der Umgebungsvariablen überlegen. Ein Vorschlag steht in [1], aber der hat meiner Erfahrung nach nicht mit jeder Gnome Version funktioniert (und es gibt auch noch andere Möglichkeiten).

und noch ein kleines Detail:
Andere Shells führen nicht zwangsläufig auch »~/.profile« aus, bei zsh musste ich z.B. selbst dafür sorgen.

[1] https://wiki.gnome.org/Initiatives/Wayland/SessionStart

Antworten