Estou lutando para entender a diferença entre shell_exec()
e exec()
...
Eu sempre usei exec()
para executar comandos do lado do servidor, quando eu usaria shell_exec()
?
É shell_exec()
apenas uma abreviação para exec()
? Parece ser a mesma coisa com menos parâmetros.
date
,whoami
,ifconfig
,netstat
.Respostas:
shell_exec
retorna todo o fluxo de saída como uma sequência.exec
retorna a última linha da saída por padrão, mas pode fornecer toda a saída como uma matriz especificada como o segundo parâmetro.Vejo
fonte
exec()
posso fazer tudoshell_exec()
[pode e] e mais :) " #Aqui estão as diferenças. Observe as novas linhas no final.
Observe que o uso do operador backtick é idêntico ao
shell_exec()
.Atualização: Eu realmente deveria explicar essa última. Olhando para essa resposta anos depois, nem sei por que isso saiu em branco! Daniel explica isso acima - é porque
exec
apenas retorna a última linha eifconfig
a última linha fica em branco.fonte
2>&1
no final do seu comando para redirecionar STDERR para STDOUT se você estiver em uma máquina Linux.shell_exec
- Executar comando via shell e retornar a saída completa como uma stringexec
- Execute um programa externo.A diferença é que
shell_exec
você obtém a saída como um valor de retorno.fonte
exec
retorna a última linha da saída. Se desejar, é possível transmitir opcionalmente uma matriz como o segundo parâmetro para capturar a saída completa e um número inteiro como o terceiro parâmetro para capturar o valor de retorno do comando shell, que pode ser usado para verificação de erros. A maior desvantagemshell_exec
é que ele retorna nulo se o comando falhar OU se não produzir nenhuma saída, portanto, seu valor de retorno não pode ser usado com segurança para verificação de erros.Algumas distinções que não foram mencionadas aqui:
Comparar:
Por outro lado, se a saída do comando for xml ou json, ter cada linha como parte de uma matriz não é o que você deseja, pois será necessário pós-processar a entrada em algum outro formato, portanto, nesse caso, use shell_exec .
Também vale ressaltar que shell_exec é um alias para o operador backtic, para aqueles que costumavam * nix.
exec também suporta um parâmetro adicional que fornecerá o código de retorno do comando executado:
Conforme observado na página de manual do shell_exec, quando você realmente requer um código de retorno do comando que está sendo executado, você não tem escolha a não ser usar exec.
fonte
exec
permite obter o código de retorno do comando (via&$return_var
parâmetro), enquantoshell_exec
não fornece nenhuma maneira de obtê-lo.