Dies sieht aus wie ein OS X-Fehler in Verbindung mit einem anderen undefinierten Verhalten in Ruby und Emacs.
Die Hauptursache ist, dass OS X beim Starten von Emacs über Finder die PATH
Umgebungsvariable zweimal an den Prozess übergibt ! Ich habe einen Testfall geschrieben und ihn an Apples Bug-Reporter gesendet (ID 19801095). Hier ist mein Testfall:
#!/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
Wenn Sie das speichern und dann über das Terminal ausführen, wird Folgendes gedruckt:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=Extra PATH
Dies geschieht nur am 10.10. 10.9 gibt nur einen aus PATH
.
Das ist also die Grundursache. Was ist eigentlich los? Der Emacs von http://emacsformacosx.com verwendet ein Ruby-Startskript, damit er eine Binärdatei bereitstellen kann, die unter OS X-Installationen von 10.6 bis 10.10 optimal ausgeführt wird. Dieses Startskript manipuliert Folgendes PATH
:
ENV['PATH'] += ':' + File.join(base_dir, "bin-#{arch_version}") +
':' + File.join(base_dir, "libexec-#{arch_version}")
ENV['PATH']
Manipuliert also nur die erste Instanz von PATH
in der Liste. Beim Start von Emacs wird nur die letzte Instanz von beachtet PATH
. Welches ist richtig? Nun, POSIX spricht über diesen Fall in der Spezifikation :
Wenn mehrere Zeichenfolgen in einer Umgebung eines Prozesses denselben Namen haben, sind die Folgen nicht definiert.
Das bedeutet, dass keines dieser Programme technisch falsch ist.
Ok, warum verhält es sich anders als im Terminal? Das ist , weil etwas ist , um die doppelte Ausfiltern PATH
s in der Umgebung , wenn Sie vom Terminal ausgeführt werden . Ich vermute, Bash. Es könnte aber auch Terminal.app sein. In beiden Fällen gibt es nur einen PATH
in der Umgebung, sodass der Ruby-Launcher und der Emacs korrekt kommunizieren.
Was ist dann die Lösung? Ich denke, der Ruby-Launcher muss geändert werden, um damit umzugehen, da dies das Standardverhalten in 10.10 zu sein scheint. Das ist eine Schande, denn es ist nur mehr cruft. Glücklicherweise (wie Sie aus dem obigen Testskript ersehen können) kann Ruby auf beide PATH
s zugreifen und so alles außer der letzten Instanz herausfiltern, was dazu führen würde, dass es genauso funktioniert wie Emacs.
Bearbeiten: Es gibt jetzt einen Fehlerbericht über das Emacs-Build-Projekt
Bearbeiten: Dies ist jetzt behoben. Nächtliche Builds nach dem 11. Februar und Releases, die mit 24.5 beginnen, sollten funktionieren (24.5 ist derzeit ein Vortest, sollte aber in Kürze veröffentlicht werden).