¿Por qué no veo una ruta a etags en PATH cuando se ejecuta Emacs desde http://emacsformacosx.com/ desde el dock OS X?

1

Esta es una pregunta de seguimiento para la pregunta "¿Está /usr/bin/etags severamente desactualizado en Yosemite?"

El Emacs en cuestión es de enlace (GNU Emacs 24.4.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21 ) del 2014-10-20 en builder10-9.porkrind.org).

Si inicio Emacs desde el dock, entonces no veo en PATH :

/Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_9:/Applications/Emacs.app/Contents/MacOS/libexec-x86_64-10_9

Si uso el script descrito en enlace , veo las entradas anteriores en PATH . Pero incluso en este caso, /usr/bin aparece primero en PATH . Para usar los etags que se encuentran en /Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_9 tengo que darle prioridad de alguna manera. Normalmente quiero ejecutar etags en un script de shell que se inicia en el búfer de shell de Emacs.

¿Por qué no veo estas entradas PATH cuando inicio Emacs desde el dock OS X (estoy usando OS X Yosemite)?

En /Applications/Emacs.app/Contents/MacOS/Emacs leí:

Emacs.app pega Emacs.app/Contents/MacOS/{bin,libexec} al final de el PATH cuando comienza, así que si nos quedamos con nuestra propia arquitectura dependiente las rutas al final de PATH entonces anularán las rutas de Emacs sin afectar las rutas de usuario.

    
pregunta Alan Wehmann 08.02.2015 - 05:52

1 respuesta

1

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).

    
respondido por el David Caldwell 11.02.2015 - 23:02

Lea otras preguntas en las etiquetas