J'essaie d'écrire tous mes sh
scripts startup / env pour travailler avec autant de DRY et autant: "fonctionne sur chaque * nix sur lequel je le clone", autant que possible. Cela signifie m'assurer que si j'essaie d'exécuter du code qui n'est pas là, que le code échoue gracieusement. À cette fin, je dois pouvoir tester si des programmes existent. Je sais comment tester si un fichier existe, mais je ne sais pas comment tester pour voir si une application est exécutable dans le chemin. Je préfère utiliser $ PATH, car certains d'entre eux doivent fonctionner sur arch, ubuntu et centos. Certains peuvent être installés dans mon homedir, sur des systèmes où je n'ai pas de racine, d'autres peuvent ne pas être installés, et d'autres encore peuvent être installés dans des chemins d'accès système.
la source
Réponses:
Utilisez
type commandname
. Cela retourne vrai sicommandname
quelque chose est exécutable: alias, fonction, commande intégrée ou externe (recherchée dans$PATH
). Vous pouvez également utilisercommand commandname
qui renvoie true sicommandname
est une commande intégrée ou externe (recherchée dans$PATH
).Il y a quelques variantes sh (certainement pré-POSIX; je connais
/bin/sh
sous OSF1 ≤3.x et certaines versions du shell Almquist trouvées dans les premières versions de NetBSD et quelques distributions Linux du 20e siècle) oùtype
renvoie toujours 0 ou non exister. Je ne pense pas que des systèmes soient livrés avec ceux-ci ce millénaire. Si vous les rencontrez, voici une fonction que vous pouvez utiliser pour rechercher$PATH
manuellement:Cette fonction est généralement utile si vous souhaitez exclure les fonctions intégrées et rechercher le nom dans
$PATH
. La plupart des shells ont une fonction intégrée pour cela,command -v
bien qu'il s'agisse d'un ajout relativement récent à POSIX (toujours facultatif à partir de POSIX: 2004). Il s'agit essentiellement d'une version conviviale detype
: il affiche le chemin complet d'un exécutable dans$PATH
, le nom nu pour une fonction intégrée ou, et une définition d'alias pour un alias.Ksh, bash et zsh doivent également
type -p
rechercher uniquement les exécutables dans$PATH
. Notez qu'en bash, le statut de retourtype -p foo
est 0 s'ilfoo
s'agit d'une fonction intégrée ou; si vous souhaitez tester un exécutable dans$PATH
, vous devez vérifier que la sortie n'est pas vide.type -p
n'est pas dans POSIX; par exemple, la cendre de Debian (qui est/bin/sh
sur Ubuntu) ne l'a pas.la source
if [ type keychain ]; then
ne fonctionnera-t-il pas? Je reçois une erreur,/home/xenoterracide/.zshrc:84: parse error: condition expected: type
je suppose que je pourrais écrire la fonction existe ... Je pensais juste que cela pourrait être plus simple dans un sens ...if type $APP >/dev/null 2>/dev/null; then ...
Vous ne voulez pas le[]
.type -p
si vous recherchez spécifiquement une commande$PATH
(pas d'alias, de fonctions ou de commandes intégrées).Si vous recherchez uniquement des programmes externes, vous pouvez également les utiliser. Je ne sais pas à quel point c'est portable.
la source
type
oucommand
;which
n'est pas dans POSIX, par exemple. En pratique,which
il existe presque partout, mais à certains endroits (où il est implémenté en tant que script csh), il utilise un chemin différent (en raison de a.cshrc
), ce qui va à l'encontre du but.