1 votos

Imposible redirigir el stderr del subproceso en MacOS

Ejecutar lo siguiente en Terminal en MacOS Mojave

php -r 'foo();' 2>/dev/null

Produce

Fatal error: Uncaught Error: Call to undefined function foo() in Command line code on line 1

Error: Call to undefined function foo() in Command line code on line 1

Call Stack:
    0.0002     390016   1. {main}() Command line code:0

Pero en Ubuntu Xenial y FreeBSD no produce ninguna salida, lo cual es de esperar, ya que estoy silenciando el error. He probado con zsh 5.7.1, bash 3.2.57 por defecto y bash 5.0.11. Me interesa saber por qué ocurre esto en MacOS.

Otra cosa interesante aquí es que cuando se redirige tanto stdout como stderr, finalmente no hay salida. Pero al no redirigir ni stdout ni stderr se produce el efecto de silencio.

Más información:

  ~ type php
php is /usr/local/bin/php
  ~ file $(type -p php)
php:                cannot open `php' (No such file or directory)
is:                 cannot open `is' (No such file or directory)
/usr/local/bin/php: Mach-O 64-bit executable x86_64
  ~

0 votos

¿Cuál es el resultado de type php y file $(type -p php) ?

0 votos

También, php -r 'foo();' 1>/dev/null suprime la salida aquí (que por supuesto no es lo que quieres)

0 votos

Se ha añadido esta información al mensaje original

1voto

Jose Chavez Puntos 645

Este comportamiento particular no tiene nada que ver con la "imposibilidad" de redirigir el stderr del subproceso en MacOS. No es imposible, y funciona como cabría esperar, es decir, de forma similar a Linux y FreeBSD.

El problema es que estás usando diferentes configuraciones de PHP en esas configuraciones. Parece que no estás usando el PHP suministrado de serie, sino algo más - pero lo explicaré de acuerdo con el PHP de serie considerando que lo mismo se aplicará a una instalación personalizada.

La forma en que PHP trabaja es que emite este tipo de mensajes de error de acuerdo con la configuración de la directiva "display_errors". Puede elegir entre silenciarlo por completo (es decir, no mostrar nunca el error), enviarlo a stdout (el valor predeterminado) o enviarlo a stderr.

Comúnmente se establece el valor de display_error en /etc/php.ini - si no tiene un archivo php.ini, o display_errors no está establecido en él, se pondrá por defecto en stdout. Si está usando un php personalizado, la ubicación del archivo php.ini variará.

Puedes probarlo realizando lo siguiente en el Terminal:

php -r 'foo();' 2>/dev/null

Produce

Fatal error: Uncaught Error: Call to undefined function foo() in Command line code:1
Stack trace:
#0 {main}
  thrown in Command line code on line 1

Sin embargo, corriendo:

php -d'display_errors=stderr' -r 'foo();' 2>/dev/null

No produce ninguna salida.

También puede utilizar 1>/dev/null para redirigir stdout, y entonces verás que el comportamiento se invierte entre esos dos ejemplos.

Tenga en cuenta también que la configuración "on" para display_errors es la misma que "stdout".

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X