$ HOME / bin dir befindet sich nicht im $ PATH

10

In meinem habe ~/.profileich einen letzten Block, der mein persönliches bin/ directoryso laden soll :

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

Aber es ist scheinbar nicht geladen:

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Warum funktioniert das nicht? (Meine Shell ist Bash.)

Für Tigger bearbeiten

echo $0 => bash

echo $HOME => /home/student

whoami => student

less /etc/*-release => 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Chris Tang
quelle
Hintergrundinformationen zu diesem Teil von .profilefinden Sie unter askubuntu.com/questions/284640 .
JdeBP
Welche Schale ist das?
NJSG
2
Ich nehme an, das Verzeichnis existiert, oder?
Schlagen Sie Bolli
@njsg es ist bash
Möglicherweise setzt etwas anderes Ihre PATH-Variable zurück, nachdem dies ausgeführt wurde. Sie können dies überprüfen, indem Sie -xdas an bash übergebene Flag verwenden und sehen, wo der PATH zurückgesetzt wird. Außerdem müssen Sie export PATH="$HOME/bin:$PATH"es für nachfolgende Prozesse bereitstellen.
Charles Addis

Antworten:

9

Von oben ~/.profile:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

Also (wenn Sie bashals Shell verwenden) Ich vermute entweder ~/.bash_profileoder ~/.bash_loginist auf Ihrem System. Wählen Sie eine aus und bearbeiten Sie sie so, dass sie Folgendes enthält:

export PATH=$PATH:$HOME/bin

Speichern und / source ~/.bash_loginoder abmelden und erneut anmelden.

Bearbeiten :

Sie sagen, dass beide ~/.bash_profileund ~/.bash_loginbeide in Ihrem fehlen $HOME. Ich denke, wir müssen ein paar Dinge bestätigen. Bitte posten Sie die folgenden Ergebnisse in Ihrer ursprünglichen Frage:

echo $0
echo $HOME
whoami
less /etc/*-release

Bearbeiten 2 :

Persönlich weiß ich ~/.profileaufgrund der bereitgestellten Informationen und Unterlagen nicht, warum in Ihrem Fall nicht enthalten ist. Beim Testen habe ich festgestellt, dass meine beim ~/.profileEinscannen gescannt wird, sshaber nicht, wenn ich ein neues Terminal starte.

Es gibt jedoch eine einfache Lösung, $HOME/binmit der Sie in Ihre interaktive Shell aufgenommen werden können. Bearbeiten (erstellen, falls nicht vorhanden) ~/.bashrcund fügen Sie die folgende Zeile hinzu:

export PATH=$PATH:$HOME/bin

Speichern, abmelden und wieder anmelden oder source ~/.bashrc.

Die exportZeile kann erweitert werden, um zu überprüfen, $HOME/binob sie vorhanden ist, wenn Sie möchten mit:

if [ -d "$HOME/bin" ]
then
    export PATH=$PATH:$HOME/bin
fi

Warum ~/.bashrcstatt einer anderen Datei? Persönliche Präferenz und scheint auch zuverlässiger zu sein.

Tigger
quelle
Da der Fragesteller jedoch nicht angegeben hat, welche Shell verwendet wird, besteht auch die Möglichkeit, dass die Bourne Again-Shell überhaupt nicht verwendet wird. Sicherlich sind es andere Leute mit dieser Frage nicht.
JdeBP
@JdeBP: Klarstellung zur Beantwortung hinzugefügt. Angenommen, als Debian-Benutzer hätten sie ihre standardmäßige interaktive Shell nicht geändert, aber ich denke, sie könnten es getan haben.
Tigger
Ich habe keine der ~/.bash_profilenoch ~/.bash_login. Bei mir ~gibt es nur .bash_historyund .bash_logout(und natürlich die .profile).
@Tigger aktualisiert!
@student: Ein weiteres Update gemacht. Wirklich ratlos, was los ist. Ziemlich interessiert zu hören, ob Sie herausfinden, warum ~/.profileübersprungen wird.
Tigger
6

Die Regeln für In-Sourcing-Shell-Startdateien sind komplex . Es ist wahrscheinlich, dass Ihr Setup .profilenicht berücksichtigt wird, wenn Sie ein neues Terminal innerhalb einer X-Sitzung öffnen (versuchen Sie, ein echo .profileInside-In zu platzieren, .profileund prüfen Sie, ob die Meldung beim Starten einer Shell angezeigt wird).

.  "$HOME/.profile"

sollte das Profil manuell neu laden.

Das An- und Abmelden von X sollte ebenfalls .profilezum Laden führen.

Alternativ können Sie . $HOME/.profilevon .bashrc(während Sie einen variablenbasierten Schutz verwenden, um eine doppelte Einbeziehung zu verhindern) sicherstellen, dass er .profileimmer enthalten ist, wenn Sie eine Shell starten.

(Dies sollte nicht erforderlich sein, export PATHda PATHes sich bereits um eine exportierte Variable handelt. Wenn Sie ihren Wert ändern, ändert sich ihr exportStatus nicht.)

PSkocik
quelle
Beschaffung von .profile von .bashrc! In den meisten Fällen enthält .profile `. .bashrc`, das geht nicht durch eine Endlosschleife ?!
Jonah
@youness Ich mache beides und verwende includeguards ( [ -z "$has___profile" ] || return; has__profile=1), damit ich keine Endlosschleifen bekomme und beides .profileund .bashrc(nur wenn BASH_VERSION definiert ist) egal wie ich dorthin gekommen bin.
PSkocik
Ich hab es geschafft ! Mein schlechtes Englisch hat mich dazu gedrängt, diese nicht benötigte Frage zu stellen (Code zur Erklärung zu setzen ist besser als wörtlicher Ausdruck). Danke für deine Zeit :-)
Jonah
Eine einfache bash -lwird geladen .profile(es sei denn, eine ungerade Konfiguration). Außerdem sollte der PFAD korrekt eingestellt sein, wenn sich der Benutzer anmeldet. Dies bedeutet, dass im verwendeten "Display Manager" (dm) Gnome, KDE, xfce, lxde usw. verwendet werden
Isaac
1

Wenn Sie .profilegeladen werden möchten, müssen Sie lediglich eine Login-Shell starten:

$ bash -l

Das sollte für eine laufende Sitzung ausreichen. Sie können den PFAD vor und nach dem Start einer Anmelde-Bash vergleichen, um den Unterschied zu bestätigen.

Für eine dauerhaftere Lösung muss eine Anmeldeshell irgendwann vor dem Start Ihres Terminals (Konsole) gestartet werden. Die Anmeldung als bestimmter Benutzer erfolgt auf einem dm (Display Manager) (gnome, kde, xfce, lxde usw.). Es sollte die Aufgabe eines jeden von ihnen sein, die Umgebungsvariable PATH an Ihre Bedürfnisse anzupassen.

Für xfce besteht die Lösung beispielsweise darin, Folgendes zu ändern xinitrc:

$ cat >"$HOME/.config/xfce4/xinitrc" <<-\_EOT_
#!/bin/sh

# Ensure programs in ~/bin are available for the X session.
p="$HOME/bin";
[ "$p" != "${PATH%%:*}" ] && export PATH=$p:$PATH
_EOT_
cat "/etc/xdg/xfce4/xinitrc" | tail -n+2 >> "$HOME/.config/xfce4/xinitrc"

Für Gnome scheint es, dass die zu ändernde Datei ist ~/.pam_environment.

Befolgen Sie für KDE diese Anleitung , um die Datei zu erstellen. Sie können diesen Code verwenden:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
Isaac
quelle