Comment vérifier si une commande shell existe depuis PHP
J'ai besoin de quelque chose comme ça en php:
If (!command_exists('makemiracle')) {
print 'no miracles';
return FALSE;
}
else {
//safely call the command knowing that it exists in the host system
shell_exec('makemiracle');
}
Existe-il des solutions?
- Double Possible: Comment faire pour vérifier si une commande peut être exécutée?
Vous devez vous connecter pour publier un commentaire.
Sur Linux/Mac OS Essayez ceci:
Ensuite l'utiliser dans le code:
Mise à jour:
Comme suggéré par @camilo-martin vous pouvez simplement utiliser:
return !empty(shell_exec("which $cmd"));
return !!`which $cmd`
. C'est en fait tellement court que je ne l'utiliserais comme ça à une condition:if (`which foo`) { ... }
where
sur windows.which
pour cela."which %s"
sera la cause de la sortie sur la sortie STDERR si il ne peut pas trouver le programme, et la sortie à l'écran (si vous exécutez à partir de la CLI) ou le journal des erreurs (s'il est exécuté à partir du web). Utilisation"which %s 2>/dev/null"
pour supprimer cette sortie.Windows utilise
where
, les systèmes UNIXwhich
pour permettre de localiser une commande. Les deux renvoie une chaîne vide dans STDOUT si la commande n'est pas trouvée.PHP_OS est actuellement WINNT pour charge toutes les version de Windows par PHP.
Alors, voici une solution portable:
command -v
pour UNIX si qui ne donnent pas satisfaction, comme indiqué par la question et compte tenu par @rr.where
effectivement échoue si vous passez le chemin complet de la commande. Récentes de Windows, il s'attend à unpath:wildcard
et pas un nom de fichierINFO: Could not find files for the given pattern(s).
sont possibles.Vous pouvez utiliser is_executable pour vérifier si il est exécutable, mais vous avez besoin de connaître le chemin d'accès de la commande, vous pouvez utiliser
which
de commande pour l'obtenir.shell_exec( 'which curl' )
me donne/usr/bin/curl
cela signifie quecurl
commande shell existe, non? Pourquoi ai-je encore besoinis_executable
dans le cas?Plate-forme indépendante de solution:
Basé sur @jcubic et que "qui" devrait être évité, c'est la croix-plate-forme, je suis venu avec:
Basé sur @xdazz réponse, fonctionne sur Windows et Linux. Il devrait également travailler sur MacOSX trop, puisque c'est unix.
celui-ci est compatible solution à l'aide de la valeur de retour de "où" et le "qui" 🙂
Non, il n'y a pas.
Même en ayant un accès direct à un shell, vous ne savez pas si une commande existe. Il y a quelques trucs comme
wheris
oufind /-name yourcommand
mais que pas une garantie à 100% que vous pouvez exécuter la commande.which
etwhereis
sont plus que suffisantes pour vous dire si une commande existe. Vous pouvez également exécuter la commande si c'est sécuritaire de le faire, par exemple,curl --version &>/dev/null
sera vide si la commande ne pas existent.