¿Cómo funciona Shell_exec como si los comandos se ejecutaran dentro de la terminal mac?

Cuando estoy ejecutando el comando dentro de un script php

echo shell_exec("which php"); 

Obtengo el siguiente resultado:

 /usr/bin/php 

Sin embargo, cuando se ejecuta el mismo comando dentro de la terminal mac

  which php 

estoy obteniendo la siguiente salida

  php: aliased to /Applications/MAMP/bin/php/php5.5.10/bin/php 

¿Mi pregunta es cómo dejar que shell_exec actúe como si los comandos se ejecutaran dentro de la terminal mac?

nota: que tengo ZSH instalado

Respuesta corta:

Esto no funcionará (confiablemente).

Respuesta larga:

El problema es triple:

  1. PHP no usa tu shell de inicio de sesión pero /bin/sh
  2. Los alias deben establecerse en el contexto en que se usan
  3. El resultado del which depende de $PATH

Para ver 1. Puede imprimir el nombre del shell en ejecución haciendo eco de $0

 % echo $0 zsh % php -r 'echo shell_exec("echo \$0");' sh 

Como puede ver, PHP inicia sh lugar de zsh . Eso significa que también usa los comandos de sh o busca un comando si no hay incorporado:

 % php -r 'echo shell_exec("which which");' /usr/bin/which % zsh -c 'which which' which: shell built-in command 

A menos que sh vincule con zsh , eso significa que, si desea usar los builtins de zsh, debe ejecutar su comando con zsh :

 echo shell_exec("zsh -c 'which php'"); 

Esto inicia /bin/sh , que a su vez inicia zsh , que luego ejecuta el comando.

Si bien puedes trabajar con PHP usando sh , el segundo problema es más grave: los alias solo se establecen dentro de la instancia en la que están definidos. La mayoría de las veces esto sucede en algún archivo de configuración (p ~/.zshrc Ej. ~/.zshrc ). Pero estos archivos de configuración no se cargan cuando se utiliza zsh no interactiva y tampoco los alias se pasan a procesos secundarios:

 % grep foo ~/.zshrc alias foo=bar % which foo foo: aliased to bar % zsh -c 'which foo' foo not found % php -r 'echo shell_exec("zsh -c which\ foo");' foo not found 

En conclusión, eso significa que usarlo desde dentro de un script PHP es una manera completamente poco confiable de averiguar el origen / ubicación de php . Aún más, ya que el resultado depende de $PATH , que también puede ser diferente para shells interactivos y no interactivos.

No puedes hacer eso en el nivel de php.

La salida que obtienes de tu llamada es generada por el progtwig shell que ejecuta tu solicitud. Ese shell no está dentro de php, sino un shell controlado en un sistema y su comportamiento también depende del sistema. No puede esperar el mismo comportamiento en su sistema Linux local que el que obtendría de algún sistema Mac.

Si su pregunta es por qué se generan diferentes resultados en ambos casos, entonces la respuesta es: porque se instalan diferentes intérpretes php. Obviamente, el shell te apunta al que está instalado y preferido en el sistema en el que se está ejecutando. Todo lo demás no tendría sentido. El hecho de que en el segundo ejemplo, php es un alias dentro de ese shell que apunta a esa ruta, no hay información de ningún valor en su sistema Linux local.