Tenho o código abaixo:
$xxx = shell_exec('sudo chown -R user:user "/temp123" 2>&1');
Funciona muito bem, quer dizer, o usuário/grupo está definido corretamente.
Mas o problema é que quando eu coloco echo
a variável $xxx
ela parece vazia, mas não está.
Por exemplo, o código:
echo '|' . $xxx . '|';
Retorna ||
. Também o código:
echo strlen($xxx);
Retorna 0
. No entanto, se eu tentar este código:
if ($temp1122 !== '') {
echo 'is not empty';
}
Ele sempre retorna is not empty
. Tentei ecoar, $xxx[0]
mas o PHP retorna um erro dizendo que não há nenhum caractere naquele índice. Então, o que está acontecendo? Acho que algum caractere de controle está sendo retornado por , shell_exec
mas deveria mudar strlen
ou ficar uniforme, [0]
certo?
shell_exec()
retornanull
se o comando não produz nenhuma saída.chown
Normalmente não imprime nada quando funciona, então isso é normal.Quando você
echo
faz isso, o PHP convertenull
em uma string vazia''
, então você só vê||
.Mas lembre-se:
null !== ''
eles não são a mesma coisa. Se não tiver certeza, faça umvar_dump($xxx)
e você verá.Veja a documentação oficial: valores de retorno do shell_exec
Isto é apenas uma confusão. Observe que echo stringyfica as expressões. Além disso, você usa o operador de concatenação de strings (ponto ".") e, com ele, as variáveis também serão convertidas para string.
o que você normalmente deseja para inspecionar mais profundamente um tipo de variável é gettype() e para valores pequenos var_export() também pode ser útil:
correção: como Barmar apontou, var_dump() geralmente é mais prático:
dessa forma você terá melhores insights, aqui com três tipos shell_exec() pode retornar:
Experimente você mesmo em 3v4l.org: https://3v4l.org/1MoSD
(começando com um comentário)
Conceder privilégios de sudo ao UID do seu servidor web é muito perigoso. Não restringir isso a scripts de shell específicos é muito, MUITO perigoso.
Então o comando foi executado com sucesso. Ao fazer isso, não há saída. Do manual do fine :
E em PHP nulo é um tipo e também um valor.
Você disse:
Isso só seria válido para uma matriz indexada ou uma string.
PHP é uma linguagem tipada, mas é dinamicamente tipada. Portanto, quando você compara valores de tipos diferentes, o PHP converte um deles para corresponder ao outro.
Da próxima vez tente olhar para
serialize($xxx)
.