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_exec
devuelve todo el flujo de salida como una cadena.exec
devuelve 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
exec
solo devuelve la última línea yifconfig
la última línea está en blanco.fuente
2>&1
al 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_exec
usted obtiene la salida como un valor de retorno.fuente
exec
devuelve 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_exec
es 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
exec
permite obtener el código de retorno del comando (a través del&$return_var
parámetro), mientras queshell_exec
no proporciona ninguna forma de obtenerlo.