Sử dụng type commandname
. Điều này trả về true nếu commandname
có bất cứ thứ gì có thể thực thi được: bí danh, hàm, lệnh tích hợp hoặc lệnh bên ngoài (tra cứu $PATH
). Ngoài ra, sử dụng command commandname
trả về true nếu commandname
là lệnh tích hợp hoặc bên ngoài (tra cứu $PATH
).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Có một vài biến thể sh (chắc chắn là tiền POSIX; tôi biết trong /bin/sh
OSF1 3.x và một số phiên bản của vỏ Almquist được tìm thấy trong các phiên bản NetBSD đầu tiên và một vài bản phân phối Linux thế kỷ 20) type
luôn trả về 0 hoặc không hiện hữu. Tôi không nghĩ rằng bất kỳ hệ thống nào được vận chuyển trong thiên niên kỷ này. Nếu bạn từng gặp chúng, đây là một chức năng bạn có thể sử dụng để tìm kiếm $PATH
theo cách thủ công:
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Hàm này thường hữu ích nếu bạn muốn loại trừ các hàm dựng sẵn và các hàm và tìm kiếm tên trong đó $PATH
. Hầu hết các shell đều được tích hợp sẵn cho điều này, command -v
mặc dù đây là một bổ sung tương đối gần đây cho POSIX (vẫn là tùy chọn kể từ POSIX: 2004). Về cơ bản, đây là phiên bản thân thiện với lập trình viên type
: nó in đường dẫn đầy đủ cho một tệp thực thi $PATH
, tên trần cho hàm tích hợp hoặc hàm và định nghĩa bí danh cho bí danh.
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Ksh, bash và zsh cũng phải type -p
tìm kiếm chỉ thực thi trong $PATH
. Lưu ý rằng trong bash, trạng thái trả về type -p foo
là 0 nếu foo
là hàm tích hợp hoặc hàm; nếu bạn muốn kiểm tra một tệp thực thi $PATH
, bạn cần kiểm tra xem đầu ra không trống. type -p
không có trong POSIX; ví dụ tro của Debian ( /bin/sh
trên Ubuntu) không có nó.