Esto parece un OS X error junto con diferente comportamiento indefinido en Ruby y Emacs.
La causa root es que a la hora de lanzar Emacs desde el Finder de OS X está pasando el PATH
variable de entorno para el proceso dos veces! Escribí un caso de prueba y la presentó a Apple bug reporter (id 19801095). Este es 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 usted guardar y, a continuación, ejecutarlo desde la Terminal, a continuación, se imprimirá:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=Extra PATH
Esto sólo sucede en 10.10. 10.9 sólo se imprime una PATH
.
Así que esa es la causa de la root. Lo que realmente está pasando? El Emacs de http://emacsformacosx.com utiliza un Rubí lanzador de secuencia de comandos para que se pueda enviar un binario que se ejecuta de forma óptima en OS X se instala de 10.6 a 10.10. Este lanzador de secuencia de comandos de manipulación de los PATH
:
ENV['PATH'] += ':' + File.join(base_dir, "bin-#{arch_version}") +
':' + File.join(base_dir, "libexec-#{arch_version}")
Por lo ENV['PATH']
sólo manipula la primera instancia de PATH
en la lista. Cuando Emacs lanza, sólo presta atención a la última instancia de PATH
. Que es derecho? Bueno, POSIX habla sobre este caso en la especificación:
Si hay más de una cadena en un entorno de un proceso tiene el mismo nombre, las consecuencias son indefinidos.
Eso significa que ninguno de estos programas son técnicamente en el mal.
Ok, así que ¿por qué se comportan de manera diferente desde la Terminal? Eso es porque algo está filtrando el duplicado PATH
s en el medio ambiente cuando se ejecuta desde la Terminal. Sospecho bash. Pero también podría ser Terminal.app. De cualquier manera, no sólo una PATH
en el entorno y el Rubí launcher y Emacs se comunican correctamente.
Así que ¿cuál es la solución entonces? Creo que el Ruby lanzador necesita cambiar para lidiar con esto, ya que es el comportamiento predeterminado en 10.10. Eso es una vergüenza, ya que es simplemente más información antigua. Por suerte (como se puede ver en la anterior secuencia de comandos de prueba), Ruby puede llegar a tanto PATH
s por lo que se puede filtrar todo, pero la última instancia hacer que funcione de la misma manera Emacs obras.
Edit: ahora Hay un informe de fallo en el Emacs proyecto de construir
Edit: Esto ya se ha solucionado. Todas las noches se construye después de 11 de febrero y libera comienzo con un 24,5 debería funcionar (24.5 es actualmente un pretest, pero debe ser publicado próximamente).