Co znaczy „hasm rm”?

58

Przeglądam http://mywiki.wooledge.org/BashGuide/CommandsAndArguments i natknąłem się na:

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a shell builtin

Nieco wcześniej przewodnik wymienił różne typy poleceń rozumianych przez Bash: aliasy, funkcje, wbudowane, słowa kluczowe i pliki wykonywalne. Ale nie było mowy o „hashed”. Co w tym kontekście oznacza „hashed”?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

59

To kwestia wydajności; zamiast przeszukiwać całą ścieżkę pliku binarnego za każdym razem, gdy jest wywoływana, jest ona umieszczana w tabeli skrótów w celu szybszego wyszukiwania. Tak więc każdy plik binarny, który jest już w tej tabeli skrótów, jest mieszany. Jeśli przenosisz pliki binarne, gdy są już zakodowane, nadal będzie próbował wywoływać je w swojej starej lokalizacji.

Zobacz także help hashlub man bashwyszukaj hashtam wbudowane polecenia.

frostschutz
źródło
15

Jak wspomnieli inni, skrót jest tablicą asocjacyjną (klucz -> wartość), którą Bash utrzymuje, tak więc gdy polecenie jest wykonywane, Bash najpierw przeszukuje ten skrót, aby sprawdzić, czy położenie polecenia na dysku zostało już znalezione $PATHi tam zapisane dla szybszego wyszukiwania.

Możesz wstępnie załadować skrót, podając listę poleceń, które Bash ma znaleźć podczas jego wywoływania. Ta zmienna jest nazywana BASH_CMDS.

fragment strony podręcznika man

   BASH_CMDS
          An  associative  array  variable  whose members correspond to the 
          internal hash table of commands as maintained by the hash builtin.
          Elements added to this array appear in the hash table; unsetting 
          array elements cause commands to be removed from the hash table.

Dodatkowo, jeśli spojrzysz na stronę podręcznika użytkownika Bash, znajduje się sekcja zatytułowana WYKONANIE POLECENIA, która szczegółowo opisuje maszynę stanu, z której korzysta Bash po wpisaniu polecenia w wierszu polecenia.

fragment

   If the name is neither a shell function nor a builtin, and contains no 
   slashes, bash searches each element of the PATH for a directory con
   taining an executable file by that name.  Bash uses a hash table to 
   remember the full pathnames of executable files (see hash  under  SHELL
   BUILTIN COMMANDS below).  A full search of the directories in PATH is 
   performed only if the command is not found in the hash table.  If the
   search is unsuccessful, the shell searches for a defined shell function 
   named command_not_found_handle.  If that  function  exists,  it  is
   invoked  with  the  original command and the original command's arguments 
   as its arguments, and the function's exit status becomes the exit
   status of the shell.  If that function is not defined, the shell prints 
   an error message and returns an exit status of 127.

Za pomocą -lprzełącznika możesz dowiedzieć się, co aktualnie znajduje się w haszowaniu .

Przykład

$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls
slm
źródło
bardzo pomocny dziękuję. Kiedy pracuję nad skryptem, okazuje się, że ta funkcja mieszania przeszkadza. Czy istnieje sposób, aby to wyłączyć lub wyczyścić?
qodeninja
10

hash jest wbudowaną powłoką Bash, która zapewnia haszowanie poleceń.

hash [-lr] [-p filename] [-dt] [name]

Prosto z pyska konia:

help hash

Zapamiętaj lub wyświetl lokalizację programu.

info Bash → Wbudowane polecenia powłoki → Wbudowane powłoki Bourne'a

Zapamiętaj pełne ścieżki poleceń określonych jako argumenty NAZWA, więc nie trzeba ich wyszukiwać przy kolejnych wywołaniach. Polecenia można znaleźć, przeszukując katalogi wymienione w $PATH. Ta -popcja blokuje wyszukiwanie ścieżki, a FILENAME jest używana jako lokalizacja NAME. Ta -ropcja powoduje, że powłoka zapomina o wszystkich zapamiętanych lokalizacjach. Ta -dopcja powoduje, że powłoka zapomina zapamiętaną lokalizację każdego NAZWY. Jeśli -topcja jest podana, drukowana jest pełna nazwa ścieżki, której odpowiada każda NAZWA. Jeśli dostarczonych jest wiele argumentów -tNAME, NAME jest drukowane przed zaszyfrowaną pełną nazwą ścieżki. Ta -lopcja powoduje, że dane wyjściowe są wyświetlane w formacie, który można ponownie wykorzystać jako dane wejściowe. Jeśli nie podano argumentów lub jeśli tylko-ljest dostarczany, drukowane są informacje o zapamiętanych poleceniach. Status zwracany jest zero, chyba że NAME nie zostanie znaleziony lub podana zostanie niepoprawna opcja.

Ruban Savvy
źródło