Warum wird in PATH kein Pfad zu etags angezeigt, wenn Emacs von http://emacsformacosx.com/ aus dem OS X-Dock ausgeführt wird?

1

Dies ist eine Folgefrage zu der Frage unter "Ist /usr/bin/etagsYosemite stark veraltet?"

Der fragliche Emacs stammt von http://emacsformacosx.com/ (GNU Emacs 24.4.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21) vom 20.10.2014 auf builder10-9.porkrind.org ).

Wenn ich Emacs vom Dock aus starte, sehe ich nicht in PATH:

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

Wenn ich das unter http://emacsformacosx.com/tips beschriebene Skript verwende, werden die obigen Einträge in angezeigt PATH. Aber auch in diesem Fall /usr/binkommt zuerst in PATH. Um die in gefundenen etags zu verwenden, muss /Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_9ich sie in irgendeiner Weise priorisieren . Normalerweise möchte ich etags in einem Shell-Skript ausführen, das im Emacs-Shell-Puffer gestartet wird.

Warum werden diese PATHEinträge nicht angezeigt, wenn ich Emacs vom OS X-Dock aus starte (ich verwende OS X Yosemite)?

An /Applications/Emacs.app/Contents/MacOS/Emacslas ich:

Emacs.appSticks Emacs.app/Contents/MacOS/{bin,libexec}am Ende der , PATHwenn es beginnt, so dass , wenn wir unsere eigene Architektur abhängig Pfade auf dem Ende des Stockes PATHdann werden sie Emacs Pfade außer Kraft setzen , während keine Benutzerpfade zu beeinflussen.

Alan Wehmann
quelle

Antworten:

1

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 PATHUmgebungsvariable 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 PATHin 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 PATHs 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 PATHin 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).

David Caldwell
quelle