`Hash -p` có thay đổi tên đường dẫn của tên lệnh bên ngoài không?


2

trong tôi ~.profile

PATH="/path/1/":"/path/2/":"$PATH"

/path/1//path/2/cả hai đều có các tập tin thực thi cùng tên myexecutable.

Trong một vỏ tương tác không có lợi nhuận, tôi muốn tạm thời trao đổi thứ tự tìm kiếm giữa hai thư mục.

Hướng dẫn Bash nói cho hash

Tùy chọn -p ngăn chặn tìm kiếm đường dẫn và tên tệp được sử dụng làm vị trí của tên.

Cách của tôi là

$ hash -p /path/2/myexecutable
hits    command
   3    /usr/bin/which
   4    /usr/bin/psql
   1    /bin/cat
  10    /usr/bin/sudo
   1    /bin/mv
   1    /usr/bin/whereis
   3    /bin/mkdir
  19    /bin/ls

đầu ra giống như hashvà dường như không thay đổi myexecutablethành /path/2/myexecutable:

$ which myexecutable
/path/1/myexecutable

Vì vậy, những gì hash -pthực sự làm?

Cảm ơn.

Câu trả lời:


3

Từ help hash:

băm: băm [-lr] [-p tên đường dẫn] [-dt] [tên ...]

-p tên đường dẫn sử dụng PATHNAME làm tên đường dẫn đầy đủ của NAME

Vì thế:

$ hash -p   /path/2/myexecutable   myexecutable

Sẽ làm những gì bạn muốn.

Tất nhiên, bạn có thể chơi một số trò chơi với tên thực thi:

$ hash -p   /bin/echo  myexecutable

Sẽ chạy echobất cứ khi nào bạn gọi myexecutable.

$ myexecutable Hello World
Hello World

Cảm ơn. Có đúng where myexecutalekhông thay đổi sau hash -p /path/2/myexecutable myexecutable? Tôi tìm thấy như vậy, nhưng tại sao nó?
Tim

Trường hợp không phải là một lệnh bash. Làm thế nào một lệnh bên ngoài có thể nhận thức được cấu trúc dữ liệu bash (băm) nội bộ? Bạn có thể bối rối. @Tim
Isaac

2
$ touch file
$ ls
file
$ hash
hits    command
   1    /usr/bin/touch
   1    /bin/ls
$ hash -p /hello/world/ls ls
$ ls
bash: /hello/world/ls: No such file or directory

hash -p somepath somecommandthiết lập đường băm cho somecommandđến con đường đưa somepathvào bash.

Điều này thường sẽ không giúp bạn đảo ngược PATHthứ tự tìm kiếm giữa hai thư mục vì bạn sẽ phải sử dụng hash -ptrên tất cả các nhị phân xảy ra trong cả hai thư mục. Nếu bạn chỉ có một nhị phân như vậy, nó có thể là một lựa chọn khả thi. Một giải pháp di động hơn sẽ chỉ đơn giản là trả trước giá trị của PATHvới thư mục thứ hai.

Nếu bản gốc của bạn PATH

/path/1:/path/2:...

trước tiên bạn biến nó thành

/path/2:/path/1:/path/2:...

sau đó sử dụng hash -rđể thiết lập lại các đường dẫn băm và sử dụng các nhị phân như bình thường. Chúng bây giờ sẽ được chọn từ /path/2chứ không phải từ /path/1.

Nếu bạn lưu bản gốc PATHtrong một biến tạm thời, thật dễ dàng để khôi phục.

Tóm lược:

oldpath=$PATH
PATH=/path/2:$PATH
hash -r

# do stuff

PATH=$oldpath
hash -r
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.