“ rm ถูกแฮช” หมายความว่าอย่างไร


58

ฉันจะผ่านhttp://mywiki.wooledge.org/BashGuide/CommandsAndArgumentsและเจอสิ่งนี้:

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

ก่อนหน้านี้เพียงเล็กน้อยคู่มือที่แสดงรายการคำสั่งประเภทต่างๆที่เข้าใจโดย Bash: aliases, function, builtins, keyword และ executables แต่ก็ไม่ได้พูดถึง "hashed" ดังนั้นในบริบทนี้ "แฮช" หมายถึงอะไร

คำตอบ:


59

มันเป็นเรื่องของประสิทธิภาพ แทนที่จะค้นหาเส้นทางทั้งหมดสำหรับไบนารีทุกครั้งที่มีการเรียกมันใส่ไว้ในตารางแฮชเพื่อค้นหาที่รวดเร็วยิ่งขึ้น ดังนั้นเลขฐานสองใด ๆ ที่อยู่ในตารางแฮชนี้แล้วจะถูกแฮช หากคุณย้ายไบนารีไปรอบ ๆ เมื่อพวกเขาถูกแฮชแล้วมันจะยังคงพยายามโทรหาพวกเขาในตำแหน่งเดิม

ดูเพิ่มเติมhelp hashหรือman bashค้นหาhashภายใต้คำสั่ง builtin ที่นั่น


15

ดังที่คนอื่น ๆ ได้กล่าวถึงแฮชคืออาเรย์ที่เชื่อมโยง (คีย์ -> ค่า) ที่ Bash ดูแลเพื่อให้เมื่อคำสั่งถูกดำเนินการ Bash จะค้นหาแฮชนี้ก่อนเพื่อดูว่าตำแหน่งของคำสั่งบนดิสก์นั้นถูกค้นพบ$PATHแล้ว เพื่อการค้นหาที่รวดเร็วยิ่งขึ้น

คุณสามารถโหลดแฮชล่วงหน้าได้โดยให้รายการคำสั่งที่คุณต้องการให้ Bash ค้นหาเมื่อมีการเรียกใช้ BASH_CMDSตัวแปรนี้จะเรียกว่า

ตัดตอนมาจากหน้าคน

   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.

นอกจากนี้หากคุณดูที่หน้า Bash man จะมีส่วนที่ชื่อว่าCOMMAND EXECUTIONซึ่งจะแสดงรายละเอียดของเครื่องสถานะที่ Bash ใช้เมื่อพิมพ์คำสั่งที่พร้อมท์

สิ่งที่สกัดมา

   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.

คุณสามารถค้นหาสิ่งที่อยู่ในแฮชของคุณได้ในปัจจุบันโดยใช้-lสวิตช์

ตัวอย่าง

$ 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

ขอบคุณมากที่เป็นประโยชน์ ในขณะที่ฉันกำลังทำงานกับสคริปต์ฉันพบว่าสิ่งแฮชนี้ได้รับในทาง มีวิธีปิดใช้งานหรือล้างข้อมูลนี้หรือไม่
qodeninja

10

hash เป็น Bash shell ในตัวที่ให้การแฮชคำสั่ง

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

ตรงจากปากม้า:

help hash

จำหรือแสดงตำแหน่งของโปรแกรม

info Bash →คำสั่งของเชลล์ Builtin ในตัว→เชลล์ในตัวของ Bourne

จดจำชื่อพา ธ แบบเต็มของคำสั่งที่ระบุเป็นอาร์กิวเมนต์ NAME ดังนั้นจึงไม่จำเป็นต้องค้นหาในการเรียกใช้ครั้งต่อไป $PATHคำสั่งนี้จะพบได้โดยการค้นหาผ่านไดเรกทอรีที่ระบุไว้ใน -pตัวเลือกยับยั้งการค้นหาเส้นทางและชื่อจะถูกใช้เป็นสถานที่ตั้งของชื่อ -rตัวเลือกที่เป็นสาเหตุของเปลือกจะลืมสถานที่จำได้ทั้งหมด -dตัวเลือกที่เป็นสาเหตุของเปลือกจะลืมสถานที่จำของแต่ละ NAME หาก-tมีการจัดหาตัวเลือกชื่อพา ธ แบบเต็มซึ่งแต่ละชื่อจะถูกพิมพ์ หากมีการระบุอาร์กิวเมนต์หลาย NAME พร้อมกับ-tNAME ก่อนพิมพ์ชื่อพา ธ แบบเต็มแฮช -lตัวเลือกที่เป็นสาเหตุที่ทำให้การส่งออกที่จะแสดงในรูปแบบที่อาจจะนำกลับมาใช้เป็นใส่ หากไม่มีข้อโต้แย้งจะได้รับหรือถ้าเพียง-lถูกจัดทำข้อมูลเกี่ยวกับคำสั่งที่จำได้ถูกพิมพ์ออกมา สถานะการส่งคืนเป็นศูนย์ยกเว้นว่าจะไม่พบ NAME หรือระบุตัวเลือกที่ไม่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.