PHP shell exec () vs exec()

j'ai du mal à comprendre la différence entre shell_exec() et exec() ...

j'ai toujours utilisé exec() pour exécuter des commandes côté serveur, quand utiliserais-je shell_exec() ?

est-ce que shell_exec() est juste un raccourci pour exec() ? Il semble être la même chose avec moins de paramètres.

288
demandé sur jww 2011-08-17 17:42:37

4 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 tout comme la sortie d'un tableau spécifié comme second paramètre.

voir

303
répondu Daniel A. White 2016-04-25 22:39:15

Voici les différences. Note les retours à la ligne à la fin.

> shell_exec('date')
string(29) "Wed Mar  6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar  6 14:18:12 PST 2013"

> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"

> shell_exec('ifconfig')
string(1244) "eth0      Link encap:Ethernet  HWaddr 10:bf:44:44:22:33  \n          inet addr:192.168.0.90  Bcast:192.168.0.255  Mask:255.255.255.0\n          inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n          TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:13151177627 (13.1 GB)  TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""

noter que l'utilisation du backtick operator est identique à shell_exec() .

mise à Jour: j'ai vraiment devrait expliquer que la dernière. En regardant cette réponse des années plus tard même Je ne sais pas pourquoi c'est sorti vide! Daniel l'explique ci-dessus -- c'est parce que exec ne renvoie que la dernière ligne, et la dernière ligne de ifconfig est vide.

63
répondu mpen 2014-03-31 23:18:08

shell_exec - exécutez la commande via le shell et retournez la sortie complète sous la forme d'une chaîne de caractères

exec - exécutez un programme externe.

la différence est qu'avec shell_exec vous obtenez la sortie comme une valeur de retour.

46
répondu J0HN 2015-01-14 11:14:25

quelques distinctions qui n'ont pas été abordées ici:

  • avec exec(), vous pouvez passer une variable param optionnelle qui recevra un tableau de lignes de sortie. Dans certains cas, cela pourrait économiser du temps, surtout si la sortie des commandes est déjà tabulaire.

comparer:

exec('ls', $out);
var_dump($out);
// Look an array

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it

inversement, si la sortie de la commande est xml ou json, alors avoir chaque ligne comme partie d'un tableau est pas ce que vous voulez, car vous aurez besoin de post-traiter l'entrée dans une autre forme, donc dans ce cas utilisez shell_exec.

il est également intéressant de souligner que shell_exec est un alias pour l'opérateur backtic, pour ceux utilisés pour *nix.

$out = `ls`;
var_dump($out);

exec supporte également un paramètre supplémentaire qui fournira le code de retour de la commande exécutée:

exec('ls', $out, $status);
if (0 === $status) {
    var_dump($out);
} else {
    echo "Command failed with status: $status";
}

comme indiqué dans la page de manuel de shell_exec, lorsque vous exiger un code de retour de la commande exécutée, vous n'avez pas d'autre choix que d'utiliser exec.

31
répondu gview 2015-07-30 18:54:58