PATH impostato prima di / etc / zshenv

Sto cercando di trovare quale file aggiunge /opt/texbin nella mia variabile PATH su Ubuntu. Non è presente nel mio /etc/environment . sudo grep -lr texbin . 2>/dev/null sudo grep -lr texbin . 2>/dev/null non esegue nulla nella cartella /etc E ancora se aggiungo set -x all'inizio del mio /etc/zshenv posso vedere che /opt/texbin è nel mio PATH prima che zsh fonti questo file.

Qualche idea?

Vorrei provare questo approccio per individuare la fonte di /opt/texbin nella variabile PATH:

  1. Per get un elenco di file che sono effettivamente letti (ad esempio un file non standard può essere proveniente da un altro file!), È ansible ricall zsh con l'opzione SOURCE_TRACE abilitata:

     $ zsh -o sourcetrace +/etc/zshenv:1> <sourcetrace> +/home/user/.zshrc:1> <sourcetrace> +/home/user/.zcompdump:1> <sourcetrace> +/home/user/.zshrc-last:1> <sourcetrace> 
  2. Verifica questi file, in cui entra in gioco la variabile PATH:

     $ grep -ie "path.*=" files_from_step_1 

    L'insensibilità del caso è fondamentale, poiché zsh utilizza il $path arrays, che viene automaticamente convertito nell'elenco $PATH separato dal colon come viceversa e viceversa.

  3. Se ancora non è fortunato, provare a includere un messaggio di debug in /etc/zshenv , in cui vengono prima letti i comandi:

     print -l $path 

    Questo vi darà una bella list della variabile PATH, che zsh eredita dal suo process principale (gestore di visualizzazione, process init, ecc.). *

  4. Se il path è in realtà ereditato dal process di avvio, è fondamentale sapere quali processi sono rilevanti:

     $ pstree -apH $$ 

    Questo produce un tree di process in cui viene evidenziato il process shell (pid in $$ ). Controllare anche i file di configuration per questi processi e tenere presente questo

    • source /some/file o . /some file . /some file possono anche modificare il PATH
    • se si modifica, ad esempio, /etc/profile nella tua console corrente, disconnettersi e accedere nuovamente, il process padre (gestore di accesso X) potrebbe ancora avere l'ambiente precedente. +

* Come avete scritto, il PATH contiene già /opt/texbin prima che il /etc/zshenv venga letto, controllato da set -x in /etc/zshenv . Non ho nessuna output con questa tecnica, ma con il mio passo 3, quindi ho incluso gli altri passi nella mia risposta pure.

+ Mi sono sofferto male a causa di questo comportmento qualche tempo fa …

Il modo corretto per triggersre la traccia di esecuzione o la traccia di origine all'ora /etc/zshenv viene caricata è triggersrla al command shell: zsh -l -o xtrace , zsh -l -o sourcetrace – assicuratevi di provare con il -l , poiché l'elemento di path potrebbe essere aggiunto solo al login.

Oltre a questo, se stai ancora ottenendo un elemento di path aggiunto prima che sia caricato /etc/zshenv , puoi controllare un file ~/.pam_environment . Questa è la versione utente-locale del /etc/environment e viene caricata allo stesso tempo prima dell'ambiente di shell o utente. Controllare la pagina uomo "pam_env" per ulteriori informazioni sul formato utilizzato – è diverso per il file utente.

Un'altra possibilità minore è la variabile di ambiente ENV . Quando una shell SH compatibile viene avviata in modalità compatibile con SH, il file il cui path è in ENV viene caricato come file di avvio prima di qualsiasi altra cosa. Cerca la documentazione della shell per ulteriori dettagli. login.defs viene utilizzato anche all'accesso e da vari utilità di login / utente, ma /etc/environment è lo standard per tutti i sisthemes di login moderni ed è preferibile per stabilire la variabile PATH .

La variabile PATH che viene passata alla shell al momento del login è definita in /etc/login.defs . Ci sono due configurazioni qui, ENV_SUPATH e ENV_PATH . A seconda se si accede come root o come utente, uno dei due viene passato alla shell tramite la variabile di ambiente PATH. Dopo che la variabile PATH viene passata alla shell, eventuali modifiche aggiuntive sono controllate dagli script di avvio della shell.