type commandnameใช้ สิ่งนี้จะคืนค่าเป็นจริงหากcommandnameมีสิ่งใดที่สามารถดำเนินการได้: นามแฝง, ฟังก์ชัน, คำสั่งในตัวหรือภายนอก (ค้นหาใน$PATH) อีกทางเลือกหนึ่งคือใช้คำสั่งcommand commandnameส่งคืนค่าจริงถ้าcommandnameเป็นคำสั่งในตัวหรือภายนอก (ค้นหาใน$PATH)
exists () {
type "$1" >/dev/null 2>/dev/null
}
มีตัวแปร SH หลายตัว (แน่นอนก่อน POSIX; ฉันรู้/bin/shภายใต้ OSF1 ≤3.xและเชลล์ Almquist บางรุ่นที่พบใน NetBSD รุ่นแรกและการกระจาย Linux ในศตวรรษที่ 20) ซึ่งtypeส่งคืน 0 เสมอหรือไม่ ที่มีอยู่ ฉันไม่คิดว่าระบบใด ๆ ที่ส่งมาพร้อมกับสหัสวรรษนี้ หากคุณเคยพบพวกเขานี่เป็นฟังก์ชั่นที่คุณสามารถใช้ค้นหา$PATHด้วยตนเอง:
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
ฟังก์ชั่นนี้จะเป็นประโยชน์โดยทั่วไปถ้าคุณต้องการที่จะไม่รวมตัว -ins $PATHและฟังก์ชั่นและมองขึ้นชื่อใน เชลล์ส่วนใหญ่มี built-in สำหรับสิ่งนี้command -vถึงแม้ว่ามันจะเป็นส่วนเสริมล่าสุดของ POSIX (ยังเป็นตัวเลือก ณ วันที่ POSIX: 2004) โดยพื้นฐานแล้วมันเป็นเวอร์ชันที่เหมาะสำหรับโปรแกรมเมอร์ซึ่งtypeจะพิมพ์เส้นทางแบบเต็มสำหรับการเรียก$PATHใช้งานได้ชื่อเปล่าสำหรับบิวด์อินหรือฟังก์ชันและคำจำกัดความของนามแฝงสำหรับนามแฝง
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
ksh, ทุบตีและ zsh ยังมีtype -pที่จะมองขึ้นเพียง executables $PATHใน โปรดทราบว่าในทุบตีสถานะการส่งคืนtype -p fooเป็น 0 ถ้าfooเป็นในตัวหรือฟังก์ชั่น; ถ้าคุณต้องการทดสอบการปฏิบัติการ$PATHคุณต้องตรวจสอบว่าเอาต์พุตไม่ว่างเปล่า type -pไม่ได้อยู่ใน POSIX; เช่น Debian's ash (ซึ่งอยู่/bin/shใน Ubuntu) ไม่มีอยู่