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:
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>
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.
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.). *
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 /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.