Tôi cần tìm đường dẫn của một chương trình đã cho PATH
bằng cách sử dụng tập lệnh shell. Đường dẫn phải là đường dẫn đầy đủ thực tế của chương trình, có thể được chuyển sau này đến một trong các exec*
hàm, không tìm kiếm PATH
chính nó, ví dụ execv
.
Có những chương trình như kill
, có sẵn như là một chương trình thực tế và một vỏ được tích hợp cùng một lúc. Nếu đây là trường hợp, tôi cần đường dẫn đầy đủ đến chương trình thực tế.
Có một số tiện ích có thể tìm thấy một chương trình trên PATH
như được chỉ định trong Mục 2.9.1.1, Tìm kiếm lệnh và Thực thi tiêu chuẩn POSIX .
Có which
, đó không phải là một phần của bất kỳ tiêu chuẩn. Nó có thể là một chương trình thông thường trên một số hệ thống, trong khi một số shell cung cấp cho nó là một chương trình dựng sẵn. Nó dường như có sẵn trên hầu hết các hệ thống và hệ vỏ, nhưng các shell với phiên bản dựng sẵn, cũng chỉ trả về tên của phần dựng sẵn thay vì đường dẫn đến tệp thực thi. Ngoài ra, nó không được tiêu chuẩn hóa theo bất kỳ cách nào và có thể trả về bất kỳ đầu ra nào và thực hiện các tùy chọn khác nhau.
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
Có whence
, đó là một tích hợp của một vài vỏ. Nhưng không có sẵn trên nhiều vỏ. Nó cũng sẽ trả về tên của phần dựng sẵn thay vì đường dẫn đến chương trình. A -p
có thể được thông qua để thay đổi hành vi này.
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
Có command
nội dung được chỉ định bởi POSIX: 2008 . Thật không may, nó cũng tìm kiếm các lệnh thông thường và tích hợp sẵn và sẽ trả về tên của phần dựng sẵn thay vì đường dẫn đến chương trình được tạo bóng bởi một phần tử cùng tên. Một số vỏ cũ chưa thực hiện được.
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
realpath
enable
chỉ được cung cấp bởi bash
vàzsh
type -p
. Cả bash và dash đều cho phép bạn nói command
lệnh để chạy một tệp thực thi thực tế ngay cả khi có một hàm hoặc hàm dựng sẵn có cùng tên.
command
bỏ qua các hàm (và bí danh) nhưng KHÔNG được dựng, như Q nói chính xác. Và bạn không thể luôn sử dụng shebang bởi vì không có đường dẫn nào nhận được bất kỳ shell nào, hoặc thậm chí một số vỏ POSIX, trên tất cả các hệ thống.
enable
có được chỉ định trong POSIX hay không, nhưng nếu có, bạn có thể sử dụngenable -n which
để vô hiệu hóa trình vỏ được tích hợp sẵnwhich
.