Estoy luchando por entender la diferencia entre shell_exec()y exec()...
Siempre solía exec()ejecutar comandos del lado del servidor, ¿cuándo los usaría shell_exec()?
¿Es shell_exec()solo una taquigrafía para exec()? Parece ser lo mismo con menos parámetros.

date,whoami,ifconfig,netstat.Respuestas:
shell_execdevuelve todo el flujo de salida como una cadena.execdevuelve la última línea de salida de forma predeterminada, pero puede proporcionar toda la salida como una matriz especificada como el segundo parámetro.Ver
fuente
exec()puedo [hacer] todoshell_exec()[puede,] y más :) "Aquí están las diferencias. Tenga en cuenta las nuevas líneas al final.
Tenga en cuenta que el uso del operador de retroceso es idéntico a
shell_exec().Actualización: realmente debería explicar eso último. ¡Mirando esta respuesta años después, ni siquiera sé por qué quedó en blanco! Daniel lo explica arriba: es porque
execsolo devuelve la última línea yifconfigla última línea está en blanco.fuente
2>&1al final de su comando para redirigir STDERR a STDOUT si está en una máquina Linux.shell_exec- Ejecute el comando a través de shell y devuelva la salida completa como una cadenaexec- Ejecuta un programa externo.La diferencia es que con
shell_execusted obtiene la salida como un valor de retorno.fuente
execdevuelve la última línea de la salida. Si lo desea, puede pasar opcionalmente una matriz como el segundo parámetro para capturar la salida completa, y un número entero como el tercer parámetro para capturar el valor de retorno del comando de shell, que puede usarse para la verificación de errores. El mayor inconvenienteshell_execes que devuelve nulo si el comando falla O si no produce ningún resultado, por lo que su valor de retorno no se puede usar de manera confiable para la verificación de errores.Un par de distinciones que no se mencionaron aquí:
Comparar:
Por el contrario, si la salida del comando es xml o json, entonces tener cada línea como parte de una matriz no es lo que desea, ya que deberá procesar posteriormente la entrada en otra forma, por lo que en ese caso use shell_exec .
También vale la pena señalar que shell_exec es un alias para el operador backtic, para aquellos que se usan para * nix.
exec también admite un parámetro adicional que proporcionará el código de retorno del comando ejecutado:
Como se señaló en la página del manual shell_exec, cuando realmente necesita un código de retorno del comando que se está ejecutando, no tiene más remedio que usar exec.
fuente
execpermite obtener el código de retorno del comando (a través del&$return_varparámetro), mientras queshell_execno proporciona ninguna forma de obtenerlo.