Esto parece un error de OS X junto con un comportamiento indefinido diferente en Ruby y Emacs.
¡La causa raíz es que al iniciar Emacs desde Finder, OS X está pasando la variable de entorno PATH
al proceso dos veces! Escribí un caso de prueba y lo envié al reportero de errores de Apple (id 19801095). Aquí está mi caso de prueba:
#!/bin/bash
mkdir -p /tmp/test.app/Contents/MacOS/
cat > /tmp/test.app/Contents/MacOS/test <<EOF
#!/usr/bin/env ruby
\$stdout.reopen('/tmp/test.app.log', "w")
ENV.each_pair {|k,v| puts "#{k}=#{v}" if k == 'PATH' }
EOF
chmod +x /tmp/test.app/Contents/MacOS/test
launchctl setenv PATH "Extra PATH"
open -W /tmp/test.app
cat /tmp/test.app.log
launchctl unsetenv PATH
Si lo guardas y luego lo ejecutas desde la Terminal, se imprimirá:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=Extra PATH
Esto solo sucede en 10.10. 10.9 solo imprimirá un PATH
.
Así que esa es la causa raíz. ¿Qué está pasando realmente? El Emacs de enlace utiliza un script de inicio de Ruby para que pueda enviar un binario que se ejecute de manera óptima en las instalaciones de OS X de 10.6 a 10.10. Este script de inicio manipula el PATH
:
ENV['PATH'] += ':' + File.join(base_dir, "bin-#{arch_version}") +
':' + File.join(base_dir, "libexec-#{arch_version}")
Entonces, ENV['PATH']
solo manipula la primera instancia de PATH
en la lista. Cuando se inicia Emacs, solo se presta atención a la instancia última de PATH
. ¿Cuál es correcto? Bueno, POSIX habla sobre este caso en la especificación :
Si más de una cadena en un entorno de un proceso tiene el mismo nombre, las consecuencias no están definidas.
Eso significa que ninguno de estos programas está técnicamente equivocado.
Ok, entonces ¿por qué se comporta de manera diferente a la Terminal? Esto se debe a que algo está filtrando el PATH
s duplicado en el entorno cuando se ejecuta desde Terminal. Sospecho que bash. Pero también podría ser Terminal.app. De cualquier manera, solo hay un PATH
en el entorno, por lo que Ruby Launcher y Emacs se comunican correctamente.
Entonces, ¿cuál es la solución? Creo que el lanzador de Ruby necesita cambiar para lidiar con esto, ya que parece ser el comportamiento predeterminado en 10.10. Eso es una lástima, ya que es simplemente más crucero. Afortunadamente (como se puede ver en el script de prueba anterior), Ruby puede llegar a both PATH
s para que pueda filtrar todo menos la última instancia que haría que funcione de la misma manera que Emacs.
Editar: Ahora hay un informe de errores en el proyecto de compilación de Emacs
Editar: Esto ahora está arreglado. Las compilaciones nocturnas después del 11 de febrero y las versiones que comiencen con 24.5 deberían funcionar (24.5 es actualmente una prueba previa, pero se lanzarán próximamente).