J'ai du mal à comprendre la différence entre shell_exec()
et exec()
...
Je l'ai toujours utilisé exec()
pour exécuter des commandes côté serveur, quand devrais-je utiliser shell_exec()
?
Est-ce shell_exec()
juste un raccourci pour exec()
? Il semble que ce soit la même chose avec moins de paramètres.
date
,whoami
,ifconfig
,netstat
.Réponses:
shell_exec
renvoie tout le flux de sortie sous forme de chaîne.exec
renvoie la dernière ligne de la sortie par défaut, mais peut fournir toutes les sorties sous forme de tableau spécifié comme deuxième paramètre.Voir
la source
exec()
peut [faire] toutshell_exec()
[peut,] et plus :) "Voici les différences. Notez les nouvelles lignes à la fin.
Notez que l'utilisation de l' opérateur backtick est identique à
shell_exec()
.Mise à jour: je devrais vraiment expliquer ce dernier. En regardant cette réponse des années plus tard, même je ne sais pas pourquoi cela est resté vierge! Daniel l'explique ci-dessus - c'est parce
exec
que ne renvoie que la dernière ligne, etifconfig
la dernière ligne est vide.la source
2>&1
à la fin de votre commande pour rediriger STDERR vers STDOUT si vous êtes sur une machine Linux.shell_exec
- Exécuter la commande via le shell et retourner la sortie complète sous forme de chaîneexec
- Exécutez un programme externe.La différence est que
shell_exec
vous obtenez la sortie comme valeur de retour.la source
exec
retourne la dernière ligne de la sortie. Si vous le souhaitez, vous pouvez éventuellement transmettre un tableau comme deuxième paramètre pour capturer la sortie complète, et un entier comme troisième paramètre pour capturer la valeur de retour de la commande shell, qui peut être utilisée pour la vérification des erreurs. Le plus gros inconvénientshell_exec
est qu'il retourne null si la commande échoue OU s'il ne produit aucune sortie, donc sa valeur de retour ne peut pas être utilisée de manière fiable pour la vérification des erreurs.Quelques distinctions qui n'ont pas été abordées ici:
Comparer:
Inversement, si la sortie de la commande est xml ou json, avoir chaque ligne dans un tableau n'est pas ce que vous voulez, car vous devrez post-traiter l'entrée sous une autre forme, alors dans ce cas, utilisez shell_exec .
Il convient également de souligner que shell_exec est un alias pour l'opérateur backtic, pour ceux utilisés pour * nix.
exec prend également en charge un paramètre supplémentaire qui fournira le code retour de la commande exécutée:
Comme indiqué dans la page de manuel shell_exec, lorsque vous avez réellement besoin d'un code retour de la commande en cours d'exécution, vous n'avez pas d'autre choix que d'utiliser exec.
la source
exec
vous permet d'obtenir le code retour de la commande (via le&$return_var
paramètre), tout enshell_exec
ne fournissant aucun moyen de l'obtenir.