$ HOME / bin dir nie znajduje się na $ PATH

11

W mojej ~/.profilemam ostatni blok, który powinien załadować mój osobisty w bin/ directoryten sposób:

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

Ale najwyraźniej nie jest załadowany:

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

Dlaczego to nie działa? (Moja skorupa to bash).

Edycja dla Tiggera

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
źródło
Informacje na temat tej części .profilemożna znaleźć na stronie askubuntu.com/questions/284640 .
JdeBP
Która to skorupa?
njsg
2
Zakładam, że katalog istnieje, prawda?
Pokonaj Bolli
@njsg it is bash
Możliwe, że po uruchomieniu uruchomiono zmienną PATH. Możesz to zweryfikować, używając -xflagi przekazanej do bash i sprawdzając, gdzie ŚCIEŻKA jest resetowana. Musisz export PATH="$HOME/bin:$PATH"także dostarczyć go do kolejnych procesów.
Charles Addis,

Odpowiedzi:

10

Z góry ~/.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.

Tak (jeśli używasz bashjako shell) Zgaduję, albo ~/.bash_profileczy ~/.bash_loginjest w systemie. Wybierz jeden i edytuj go, aby obejmował:

export PATH=$PATH:$HOME/bin

Następnie zapisz i source ~/.bash_loginlub wyloguj się i zaloguj ponownie.

Edytuj :

Mówisz to jedno ~/.bash_profilei ~/.bash_logindrugie brakuje w twoim $HOME. Myślę, że musimy potwierdzić kilka rzeczy. Proszę zamieścić następujące wyniki w oryginalnym pytaniu:

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

Edycja 2 :

Osobiście nie wiem, dlaczego ~/.profilenie uwzględniono go w twojej sprawie na podstawie dostarczonych informacji i dokumentacji. Podczas testów zauważyłem, że mój ~/.profileskan jest skanowany, kiedy jestem sshw środku, ale nie kiedy uruchamiam nowy terminal.

Istnieje jednak proste rozwiązanie pozwalające $HOME/binna włączenie się do interaktywnej powłoki. Edytuj (utwórz, jeśli nie jest obecny) ~/.bashrci dodaj do niego następujący wiersz:

export PATH=$PATH:$HOME/bin

Zapisz, wyloguj się i zaloguj ponownie lub source ~/.bashrc.

exportLinia może zostać rozszerzony, aby sprawdzić, że $HOME/binistnieje, jeżeli chcesz z:

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

Dlaczego ~/.bashrczamiast innego pliku? Osobiste preferencje i wydaje się również bardziej wiarygodne.

Tygrys
źródło
Chociaż, ponieważ pytający nie określił, która powłoka, istnieje również możliwość, że w ogóle nie używa się powłoki Bourne Again. Z pewnością inni ludzie z tym samym pytaniem mogą nie być.
JdeBP,
@JdeBP: dodano wyjaśnienie do odpowiedzi. Zakładając, że jako użytkownik Debiana nie zmienił domyślnej powłoki interaktywnej, ale myślę, że mogliby.
Tigger
Nie mam którekolwiek z ~/.bash_profileani ~/.bash_login. U mnie ~są tylko .bash_historyi .bash_logout(i oczywiście .profile).
@Tigger zaktualizowany!
@student: Dokonano kolejnej aktualizacji. Naprawdę ze stratą, co się dzieje. Bardzo zainteresowany, jeśli dowiesz się, dlaczego ~/.profilejest pomijany.
Tigger
6

Te zasady w-sourcing plików Uruchamianie powłoki są złożone . Prawdopodobnie w konfiguracji .profilenie włącza się, gdy otwierasz nowy terminal w sesji X (spróbuj wstawić echo .profilewnętrze .profilei sprawdź, czy komunikat pojawia się po uruchomieniu powłoki).

.  "$HOME/.profile"

powinien ręcznie ponownie załadować profil.

Logowanie i wylogowanie z X również powinno spowodować .profilezaładowanie.

Alternatywnie, można zrobić . $HOME/.profilez .bashrc(podczas korzystania straży zmiennej opartej o unikaniu podwójnego włączenia), aby upewnić się, że .profilejest zawsze włączone przy każdym uruchomieniu powłoki.

(Nie musisz tego robić, export PATHponieważ PATHjest to już wyeksportowana zmienna, a modyfikacja jej wartości nie zmieni jej exportstatusu).

PSkocik
źródło
Pozyskiwanie .profile z .bashrc! w większości przypadków .profile zawiera `. .bashrc`, to nie przejdzie przez nieskończoną pętlę?!
Jonasz
@youness Robię oba i używam include guards ( [ -z "$has___profile" ] || return; has__profile=1), więc nie otrzymuję nieskończonych pętli i oba .profilei .bashrc(tylko jeśli zdefiniowana jest wersja BASH_VERSION) bez względu na to, jak się tam dostałem.
PSkocik,
mam to ! mój zły angielski zmusił mnie do zadawania tego niepotrzebnego pytania (lepsze jest podanie kodu do wyjaśnienia niż dosłowne wyrażenie). dzięki za poświęcony czas :-)
Jonah
Prosty bash -lzaładuje .profile(chyba że jakimś dziwnym konfiguracji). Ponadto PATH powinien być poprawnie ustawiony, gdy użytkownik się loguje. Oznacza to, że w używanym „menedżerze wyświetlania” (dm): gnome, KDE, xfce, lxde itp.
Isaac
1

Jeśli chcesz, aby .profilezaładować wszystko, co potrzebne jest, aby uruchomić powłokę logowania:

$ bash -l

To powinno wystarczyć na trwającą sesję. Możesz porównać ŚCIEŻKĘ przed i po uruchomieniu bashu logowania, aby potwierdzić różnicę.

Aby uzyskać bardziej trwałe rozwiązanie, należy uruchomić powłokę logowania w pewnym momencie przed uruchomieniem terminala (konsoli). Logowanie jako określony użytkownik odbywa się na niektórych urządzeniach dm (menedżer wyświetlania) (gnome, kde, xfce, lxde itp.). Każda z nich powinna zmienić zmienną środowiskową PATH, aby dopasować ją do swoich potrzeb.

Na przykład w przypadku xfce rozwiązaniem jest zmiana 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"

W przypadku gnome wydaje się, że plik do zmiany to ~/.pam_environment.

W przypadku KDE postępuj zgodnie z tym przewodnikiem , aby utworzyć plik, możesz użyć tego kodu:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
Izaak
źródło