Perché non vedo un percorso per gli etags in PATH quando si esegue Emacs da http://emacsformacosx.com/ dal dock OS X?

1

Questa è una domanda successiva a quella di "Is /usr/bin/etags gravemente non aggiornato in Yosemite?"

L'Emacs in questione è tratto da link (GNU Emacs 24.4.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21 ) del 2014-10-20 su builder10-9.porkrind.org).

Se avvio Emacs dal dock, non vedo in PATH :

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

Se utilizzo lo script descritto al link , allora vedo le voci sopra in PATH . Ma anche in questo caso, /usr/bin viene prima in PATH . Per usare gli etags trovati in /Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_9 devo dare la precedenza in qualche modo. In genere, voglio eseguire gli etags in uno script di shell avviato nel buffer di shell di Emacs.

Perché non vedo queste voci PATH quando avvio Emacs dal dock di OS X (sto usando OS X Yosemite)?

In /Applications/Emacs.app/Contents/MacOS/Emacs ho letto:

Emacs.app bastoni Emacs.app/Contents/MacOS/{bin,libexec} alla fine di PATH all'avvio, quindi se dipendiamo dalla nostra architettura percorsi alla fine del PATH , quindi sovrascriveranno i percorsi di Emacs mentre non influisce sui percorsi degli utenti.

    
posta Alan Wehmann 08.02.2015 - 05:52
fonte

1 risposta

1

Questo sembra un bug OS X accoppiato con un comportamento indefinito diverso in Ruby ed Emacs.

La causa principale è che quando si avvia Emacs da Finder, OS X sta passando la variabile di ambiente PATH al processo due volte! Ho scritto un test case e l'ho inviato al bug reporter di Apple (id 19801095). Ecco il mio caso di test:

#!/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

Se lo salvi e lo esegui dal terminale, verrà stampato:

PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=Extra PATH

Questo succede solo il 10.10. 10.9 stamperà solo un PATH .

Quindi questa è la causa principale. Cosa sta realmente accadendo? Il link di Emacs utilizza uno script di avvio di Ruby in modo che possa spedire un file binario che funziona in modo ottimale su installazioni di OS X dal 10.6 al 10.10. Questo script di avvio modifica PATH :

ENV['PATH'] += ':' + File.join(base_dir,     "bin-#{arch_version}") +
               ':' + File.join(base_dir, "libexec-#{arch_version}")

Quindi ENV['PATH'] manipola solo l'istanza prima di PATH nell'elenco. Quando Emacs viene lanciato, presta attenzione solo all'istanza ultima di PATH . Quale è giusto? Bene, POSIX parla di questo caso nelle specifiche :

If more than one string in an environment of a process has the same name, the consequences are undefined.

Ciò significa che nessuno di questi programmi è tecnicamente sbagliato.

Ok, allora perché si comporta in modo diverso da Terminal? Questo perché qualcosa sta filtrando il duplicato PATH s nell'ambiente quando stai eseguendo da Terminal. Sospetto che Bash. Ma potrebbe anche essere Terminal.app. Ad ogni modo, c'è solo un PATH nell'ambiente e quindi il launcher e Emacs di Ruby comunicano correttamente.

Quindi qual è la soluzione allora? Penso che il launcher di Ruby debba cambiare per far fronte a questo, dal momento che sembra essere il comportamento predefinito in 10.10. È un peccato, perché è solo più cruft. Fortunatamente (come puoi vedere dallo script di test precedente), Ruby può arrivare a entrambi PATH s in modo da poter filtrare tutto tranne l'ultima istanza che lo farebbe funzionare allo stesso modo di Emacs.

Modifica: Ora c'è un bug report sul progetto di build di Emacs

Modifica: ora è risolto. Le build notturne dopo l'11 febbraio e le versioni che iniziano con 24.5 dovrebbero funzionare (il 24.5 è attualmente un pretest, ma dovrebbe essere rilasciato a breve).

    
risposta data 11.02.2015 - 23:02
fonte

Leggi altre domande sui tag