Co to są „$ PATH” i „~ / bin”? Jak mogę mieć osobiste skrypty?

29

Co to jest $PATH?

Jak mogę mieć polecenia / programy, które są dostępne tylko dla mnie?
Widziałem ~/binwcześniej wspomnianą ścieżkę , ale do czego służy i jak z niej korzystać?

Braiam
źródło
Trochę eksperymentuję, ponieważ jest to więcej pytań lub materiałów wiki niż „prawdziwe pytanie”. Został poproszony, ponieważ wspomniałem ~ / bin w poprzedniej odpowiedzi (w linkowanym pasku bocznym po prawej) i ktoś skomentował, jak dodać go do ŚCIEŻKI: teraz zamiast krótkich komentarzy, możemy link do tego postu, gdy ~ / bin jest wzmiankowany.

Odpowiedzi:

26

$ PATH to zmienna środowiskowa używana do wyszukiwania poleceń. ~ Jest twoim katalogiem domowym, więc ~ / bin będzie / home / user / bin; jest to normalny katalog.

Na przykład, gdy uruchamiasz „ls” w powłoce, faktycznie uruchamiasz program / bin / ls; dokładna lokalizacja może się różnić w zależności od konfiguracji systemu. Dzieje się tak, ponieważ / bin znajduje się w $ PATH.

Aby zobaczyć ścieżkę i znaleźć lokalizację określonego polecenia:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

Aby mieć własny prywatny katalog bin, wystarczy dodać go do ścieżki. Zrób to, edytując ~ / .profile (ukryty plik), aby uwzględnić poniższe linie. Jeśli linie są komentowane, musisz je tylko odkomentować; jeśli już tam są, wszystko gotowe!

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

Teraz musisz utworzyć katalog ~ / bin, a ponieważ .profile jest uruchamiany przy logowaniu i dodaje ~ / bin tylko wtedy, gdy istnieje, musisz zalogować się ponownie, aby zobaczyć zaktualizowaną ŚCIEŻKĘ.

Przetestujmy to:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

źródło
3
Jedną rzeczą, na którą należy zwrócić uwagę podczas używania, jest to, że znajdzie ona tylko polecenia, które są binarne w systemie plików, nie zgłasza wbudowanych powłok, aliasów ani funkcji. Często bardziej użyteczne jest typesprawdzenie, jak powłoka rozpozna rzeczywiste polecenie; np .: which echoi type echozgłasza różne rzeczy, whichzwraca „/ bin / echo”, ale „typ” zwraca informację, że jest to wbudowana powłoka, którą powłoka woli przed plikiem w „/ bin”.
Steve Beattie,
@ Steve Beattie, +1. whichjest lepiej zastępowany przez typelub commandw interaktywnych powłokach i jest całkowicie bezużyteczny w skryptach.
geirha
Należy zauważyć, że właśnie zauważyłem - $HOMEzmienna $PATHz jakiegoś powodu nie działa, tzn ~. Zamiast tego należy użyć znaku.
Hi-Angel,
19

Odnośnie ~/bini poleceń / programów dostępnych tylko dla użytkownika

Najnowsze wersje Ubuntu zawierają ~/binkatalog w twoim $PATH, ale tylko jeśli ~/binkatalog istnieje.

Jeśli nie istnieje:

  1. Upewnij się, że ~/.profilezawiera następujące zwrotki (domyślnie ~/.profilejuż tak jest):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Utwórz ~/binkatalog:

    mkdir -p ~/bin
    
  3. Uruchom ponownie komputer lub wymuś ponowne przeczytanie przez bash ~/.profile:

    exec -l bash
    
Danilo Piazzalunga
źródło
Dzięki za „restart lub exec -l bashwskazówkę”. Co robi -lflaga? Nie znajduję wyjaśnienia w man exec.
evanrmurphy,
3
exec -lwykona bash jako powłokę logowania [ wiki.bash-hackers.org/commands/builtin/exec] . Krótko mówiąc, zmusza bash do ponownego przeczytania /etc/profilei ~/.profile. Tylko uruchomienie exec bashspowoduje tylko ponowne przeczytanie ~/.bashrc.
Danilo Piazzalunga,