hash
jest wbudowanym poleceniem bash. Tabela skrótów jest funkcją bash
zapobiegającą wyszukiwaniu przy $PATH
każdym wpisaniu polecenia przez buforowanie wyników w pamięci. Tabela jest czyszczona w przypadku zdarzeń, które oczywiście unieważniają wyniki (takie jak modyfikowanie $PATH
)
hash
Polecenie jest po prostu jak na interakcję z tego systemu (na jakikolwiek powód czujesz trzeba).
Niektóre przypadki użycia:
Tak jak widziałeś, wypisuje, ile razy uderzyłeś, które polecenia, jeśli wpiszesz je bez argumentów. Może ci to powiedzieć, których poleceń używasz najczęściej.
Możesz go również użyć do zapamiętania plików wykonywalnych w niestandardowych lokalizacjach.
Przykład:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
Co może być przydatne, jeśli masz tylko jeden plik wykonywalny w katalogu poza $PATH
tym, który chcesz uruchomić, po prostu wpisz nazwę zamiast dołączać wszystko do tego katalogu (co byłoby efektem, gdybyś go dodał $PATH
).
Jednak alias zwykle może to zrobić, a ponieważ modyfikujesz zachowanie bieżącej powłoki, nie jest ona mapowana w programach, które uruchamiasz. Dowiązanie symboliczne do pojedynczego pliku wykonywalnego jest tutaj prawdopodobnie preferowaną opcją. hash
jest jednym ze sposobów na zrobienie tego.
- Możesz go użyć do zapamiętania ścieżek plików. Jest to przydatne, jeśli nowy plik wykonywalny pojawia się we wcześniejszym
PATH
katalogu lub przenosi się mv
do innego miejsca i chcesz zmusić bash do wyjścia i znalezienia go ponownie, zamiast ostatniego miejsca, w którym pamięta o znalezieniu.
Przykład:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
cp
Polecenie spowodowało nową wersję z ls
pliku wykonywalnego, aby pokazać się wcześniej w moim $PATH
, ale nie wywoła czystkę tabeli hash. Kiedyś hash -d
wybiórczo czyściłem wpis ls
z tabeli skrótów. Bash został zmuszony do $PATH
ponownego przejrzenia, a kiedy to zrobił, znalazł go w nowszej lokalizacji (wcześniej w $ PATH niż wcześniej).
Możesz selektywnie wywoływać to zachowanie „znajdź nową lokalizację pliku wykonywalnego z $PATH
”, jednak:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Powinieneś to po prostu zrobić, jeśli chcesz coś z tabeli skrótów i nie jesteś w 100% tym, co możesz wylogować, a następnie pomyślnie się zalogować lub chcesz zachować pewne modyfikacje, które wprowadziłeś w swojej powłoce.
Aby pozbyć się przestarzałych mapowań, możesz także zrobić hash -r
(lub export PATH=$PATH
), który skutecznie po prostu przeczyści całą tablicę skrótów bash.
Jest wiele takich małych sytuacji. Nie wiem, czy nazwałbym to jednym z „najbardziej użytecznych” poleceń, ale ma kilka przypadków użycia.
hash
polecenie wewnętrznie używa tabeli skrótów do przechowywania mapowań. en.wikipedia.org/wiki/Hash_tablehash
nie jest tobash
specyficzne, polecenie pochodzi z powłoki Bourne'a w SVR2 (choć funkcja wcześniejszych ścieżek poleceń pochodzicsh
wcześniej) i znajduje się we wszystkich powłokach podobnych do Bourne'a i POSIX.export PATH=$PATH
wyczyścić stół,hash -r
powinno wystarczyć.hash -r
albo dostaniesz starą wersję, ponieważ $ PATH się nie zmieniła, więc Bash nie zdaje sobie sprawy, że mógłby załadować ten sam program z wcześniejszego katalogu (o wyższym priorytecie). Szczegółowe informacje można znaleźć na stronie conda.pydata.org/docs/… .Oto klasyczne, uproszczone użycie:
źródło
hash hello
.setopt -s checkhash
jeśli plik wykonywalny skrótu dla polecenia już nie istnieje, pozycja skrótu dla tego polecenia zostanie zaktualizowana. Zauważ jednak, że każda sesja bash miała własną tablicę skrótów, więc zamknięcie sesji i rozpoczęcie nowej skutecznie opróżnia skrót. (hash -r
jest to łatwiejszy sposób.)$PATH
Wydaje się, że aktualizacja lub uruchomienie nowego terminalu bash wyczyścił tabelę.Oto przydatne zastosowanie
hash
:Oznacza to: jeśli php nie znajduje się w ŚCIEŻCE, użyj
źródło
Tak, Bash Reference Manual mówi:
Ale możesz wyłączyć haszowanie za pomocą
set +h
:Próbować:
To samo dotyczy
hash -r
,hash NAME
etcA „wykrywanie komenda” (jak to albo , że ) nie działa:
Możesz napisać coś takiego:
lub (dzięki @mikeserv) bez konieczności przypisywania nowych zmiennych lub wykonywania testów:
źródło
old_options
chodzi o twoją sprawę - zwykle robię coś takiego:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
wszystko po prostu wpasowuje się automatycznie, bez konieczności przypisywania nowych zmiennych lub wykonywania jakichkolwiek testów.Łatwe wykrywanie, czy polecenie jest dostępne:
źródło