Sử dụng type commandname. Điều này trả về true nếu commandnamecó 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 commandnametrả về true nếu commandnamelà 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/shOSF1 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) typeluô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 $PATHtheo 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 -vmặ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 -ptìm kiếm chỉ thực thi trong $PATH. Lưu ý rằng trong bash, trạng thái trả về type -p foolà 0 nếu foolà 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 -pkhông có trong POSIX; ví dụ tro của Debian ( /bin/shtrên Ubuntu) không có nó.