Tmux "ordina" la variabile PATH?


14

Ho un problema riproducibile:

  1. imposta il mio PERCORSO in Bash .profile
  2. avvia tmux da tmux, tmux attacho qualsiasi variante
  3. echo $ PATH e vederlo con gli stessi componenti ma in ordine diverso

Come fermarlo? Cosa lo spiega?

Risposte:


29

Se sei su un Mac e ti chiedi perché /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bincontinua a essere anteposto a PATH quando esegui tmux, è a causa di un'utilità chiamata path_helper che viene eseguita dal tuo /etc/profilefile.

Non puoi facilmente convincere tmux (o meglio, bash) a non fare il sorgente /etc/profile(per qualche ragione tmux funziona sempre come una shell di login, il che significa che / etc / profile verrà letto), ma puoi assicurarti che gli effetti di path_helper don avvitalo con il tuo PERCORSO.

Il trucco è assicurarsi che PATH sia vuoto prima dell'esecuzione di path_helper. Nel mio ~/.bash_profilefile ho questo:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

L'eliminazione del PERCORSO prima dell'esecuzione di path_helper gli impedirà di anteporre il PERCORSO predefinito al PERCORSO (precedentemente) scelto e consentirà il resto dei tuoi script di configurazione bash personali (comandi più in basso .bash_profile, o in .bashrccaso di provenienza .bash_profile) per configurare il tuo PERCORSO di conseguenza.

Spero che abbia un senso ...


1
Questo ha fatto totalmente per me! L'ho nascosto dietro una if [ -n "$TMUX" ]clausola, ma mi chiedevo: quanto è importante [ -f /etc/profile ], davvero? Non è sicuro presumere che /etc/profilesia sempre un file normale?
Ryan Lue,

1
@RyanLue Si potrebbe comodamente sostituire -fcon -e, ma non vorrei personalmente provare a fonte di un file da uno script che viene eseguito quando faccio il login a meno che non avevo controllato che c'era. Tendo a riutilizzare il mio script bash su molte macchine (e sistemi operativi) diversi, quindi mi piace assicurarmi che siano a prova di proiettile. Posso immaginare che alcune altre varianti di Unix potrebbero chiamarlo qualcos'altro.
Graham Ashton,

GRAZIE! Questo mi stava facendo impazzire e mettere quel piccolo frammento in cima alla mia ~/.bash_profilesanità mentale mi ha riportato al mio felice mondo.
hoosierEE

Se non si vuole pasticciare con le impostazioni predefinite del sistema, set -g default-command "${SHELL}"in .tmux.confforze tmux di utilizzare shell non-login. Non vedo il punto in quelli comunque, dato che di solito apri tmux dopo aver già effettuato l'accesso.
seeker_of_bacon

5

No; l'ordinamento $PATHsarebbe una cosa troppo folle da fare, poiché molti sistemi dipendono dal suo ordine impostato dall'utente.

Tuttavia, tmux fa iniziare la shell in modalità "login", causando ~/.profilead essere di provenienza di nuovo . Questo significa che se hai qualcosa di simile PATH=/my/dir:/another/dir:$PATHin quel file, verrà fatto di nuovo , con conseguente $ PATH contenente /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Per evitare ciò, è possibile utilizzare un'altra variabile per verificare:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"

0

@Graham Ashton Grazie per la tua idea

Il mio suggerimento sarebbe quello che hai messo

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

nel tuo file .zshrc nella parte superiore di esso.

ASSICURARSI che il tuo

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

è sotto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.