Poprawianie ustawienia ścieżki w pliku ~ / .profile

11

Jest linia, w ~/.profilektórej jest

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Nie jestem pewien co do ostatniego i.

  • Czy powinienem to usunąć?
  • Czy to nie błąd składniowy?
Uśmiech
źródło
4
@dessert Nie jestem pewien, czy to duplikat. Zgadzam się, że oba dotyczą $PATHzmiennej środowiskowej, ale wcale nie są duplikatami. Co najwyżej są powiązane. To pytanie jest problemem, w ~/.profilektórym akurat jest dodatkowym znakiem w linii, do której $PATHprzypisane jest środowisko.
Dan.
@ Dan Najwyżej głosowana (!) Odpowiedź w zduplikowanym pytaniu wyjaśnia, jak powinien wyglądać PATH=wiersz w wierszu ~/.profile- co jest tutaj prawdziwym pytaniem.
deser
1
@dessert, co ma tutaj OP, jest całkowicie poprawne, nie jest to problem z nieprawidłowym formatem. To działa, po prostu nic nie robi.
terdon
2
Tak, używam edytora vi. Być może przypadkowo wstawiłem „i” do pliku, jak powiedział deser. Ale potem musiałem: wq, aby był skuteczny. Myślę, że tego nie zrobiłem, ale biorąc pod uwagę mój poziom, mogłem zrobić coś głupiego.
Uśmiechnij się

Odpowiedzi:

13

Nie, to nie jest błąd składniowy; to tylko litera, która jest dołączana po rozwinięciu $PATH, ponieważ powłoka usuwa cudzysłowy ...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Tak więc, oprócz przygotowywania lokalnych katalogów, skutecznie usunęło istniejące /snap/binz mojej ŚCIEŻKI i dodało nieistniejące /snap/bini.

Możesz usunąć, iaby naprawić ŚCIEŻKĘ.

Aby zobaczyć zmianę, musisz się wylogować i ponownie zalogować lub uruchomić source ~/.profilew dowolnej używanej powłoce (lub uruchomić powłokę za pomocą bash -l), ponieważ .profilejest ona odczytywana tylko przez powłoki logowania .

Jeśli sam nie wprowadziłeś tej zmiany .profile, możesz przywrócić plik domyślny, uruchamiając go

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Spowoduje to zmianę nazwy starego .profile .profile.old(możesz także usunąć plik, jeśli chcesz) i zastąpienie go domyślną wersją systemu /etc/skel.

Zanna
źródło
5

Myślę, że tutaj nie jest jasne, co oznacza następujące wyrażenie:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Pierwsza część PATH=oznacza, że ​​przypisujemy nową wartość do zmiennej (środowiskowej) $PATH.

Druga część to nowa wartość tej zmiennej. W bieżącym przypadku zmienna $HOMEzostanie rozwinięta o bieżącą wartość i do tej wartości zostanie dołączony ciąg /bin:. To samo dotyczy kolejnej części łańcucha $HOME/.local/bin:. Na koniec bieżąca (poprzednia) wartość $PATHzmiennej zostanie rozwinięta i dołączona. Okrężnica :odgrywa rolę ogranicznika w PATHwyrażeniu.

Celem jest ostatecznie napisać: PATH=<some additional paths>+<the the current value of $PATH>. Umieszczamy te dodatkowe ścieżki przed ciągiem, ponieważ chcemy, aby powłoka najpierw szukała plików wykonywalnych w tych lokalizacjach, a dopiero potem w całym systemie.

Postać ijest niepotrzebna. Zostanie dołączony do nowej wartości $PATHi spowoduje bałagan, jak wyjaśnia @Zanna w swojej odpowiedzi .

pa4080
źródło
5

Tak, to błąd składniowy, rzeczywisty .profilepowinien wyglądać tak, chyba że zmieniłeś coś (jest to wersja 17.10, zobacz uwagi poniżej):

# ~/.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.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

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

Może to wyglądać inaczej w starszych wersjach Ubuntu, w których sprawdzenie, czy binkatalog użytkowników jest obecny, nie zostało uwzględnione w .profile. Najprostszym sposobem na sprawdzenie, jak powinien on wyglądać, jest spojrzenie /etc/skel/.profile.

Aby dodać zgodnie z prośbą w komentarzu, po prostu umieść to na końcu pliku profilu:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

Jeśli kiedykolwiek zepsujesz całkowicie swój profil, istnieje kopia, z której możesz pobrać nowy /etc/skel/.

Videonauth
źródło
1
Mam jedną dodatkową linię „PATH eksportu = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin”, ponieważ go zainstalowałem. Czy to w porządku?
Uśmiechnij się
3
Ta linia jest w porządku, włączyłem ją do mojego przykładu, aby pokazać, gdzie ją umieścić.
Videonauth,
1
Należy pamiętać, że /etc/skel/.profilew 16.04 wygląda inaczej, bez testu, czy "$HOME/bin"istnieje. Nawet jeśli był to lepszy wariant (IMO), wydaje się, że został zmieniony w 17.10 - z jakiegoś powodu lub przez pomyłkę.
Gunnar Hjalmarsson,
@GunnarHjalmarsson zauważy, że w moim poście, i tak, to jest plik skel / .profile z 17.10.
Videonauth,