Saya mencoba untuk menulis semua sh
skrip startup / env saya untuk bekerja dengan KERING sebanyak dan sebanyak: "bekerja pada setiap * nix saya mengkloning ke", mungkin. Ini berarti memastikan bahwa jika saya mencoba menjalankan kode yang tidak ada di sana, kode itu gagal dengan anggun. Untuk itu saya harus bisa menguji apakah ada program. Saya tahu cara menguji apakah ada file, tetapi saya tidak yakin cara menguji untuk melihat apakah suatu aplikasi dapat dieksekusi di dalam path. Saya lebih suka menggunakan $ PATH, karena beberapa di antaranya perlu bekerja di arch, ubuntu, dan centos. Beberapa mungkin diinstal di homedir saya, pada sistem di mana saya tidak memiliki root, yang lain mungkin tidak diinstal, dan yang lain saya diinstal di jalur sistem.
sumber
Jawaban:
Gunakan
type commandname
. Ini mengembalikan true jikacommandname
ada sesuatu yang dapat dieksekusi: alias, fungsi, built-in atau perintah eksternal (melihat ke atas$PATH
). Atau, gunakancommand commandname
yang mengembalikan true jikacommandname
adalah perintah bawaan atau eksternal (lihat ke atas$PATH
).Ada beberapa varian sh (pasti pra-POSIX; Saya tahu di
/bin/sh
bawah OSF1 ≤3.x dan beberapa versi shell Almquist ditemukan di versi NetBSD awal dan beberapa distribusi Linux abad ke-20) di manatype
selalu mengembalikan 0 atau tidak ada. Saya tidak berpikir ada sistem yang dikirim dengan milenium ini. Jika Anda pernah menjumpainya, berikut adalah fungsi yang dapat Anda gunakan untuk mencari$PATH
secara manual:Fungsi ini umumnya berguna jika Anda ingin mengecualikan built-in dan fungsi dan mencari nama di
$PATH
. Sebagian besar shell memiliki built-in untuk ini,command -v
meskipun ini merupakan tambahan yang relatif baru untuk POSIX (masih opsional pada POSIX: 2004). Ini pada dasarnya versi ramah-programmertype
: ia mencetak path lengkap untuk dieksekusi di$PATH
, nama telanjang untuk built-in atau fungsi, dan definisi alias untuk alias.Ksh, bash dan zsh juga harus
type -p
mencari yang hanya dapat dieksekusi di$PATH
. Perhatikan bahwa dalam bash, status pengembaliantype -p foo
adalah 0 jikafoo
merupakan built-in atau fungsi; Jika Anda ingin menguji untuk dieksekusi di$PATH
, Anda perlu memeriksa bahwa output tidak kosong.type -p
tidak dalam POSIX; misalnya abu Debian (yang ada/bin/sh
di Ubuntu) tidak memilikinya.sumber
if [ type keychain ]; then
tidak berfungsi? Saya mendapatkan kesalahan/home/xenoterracide/.zshrc:84: parse error: condition expected: type
Saya kira saya bisa menulis fungsi ada ... Saya hanya berpikir ini mungkin lebih sederhana dalam arti ...if type $APP >/dev/null 2>/dev/null; then ...
Anda tidak ingin[]
.type -p
jika Anda secara khusus mencari perintah di$PATH
(bukan alias atau fungsi atau bawaan).Jika Anda hanya mencari program eksternal, Anda juga dapat menggunakannya. Tidak tahu seberapa portabel itu.
sumber
type
ataucommand
;which
tidak ada dalam POSIX, misalnya. Dalam praktiknya,which
memang ada hampir di mana-mana, tetapi di beberapa tempat (di mana itu diterapkan sebagai skrip csh) ia menggunakan jalur yang berbeda (karena a.cshrc
), yang mengalahkan tujuannya.