Dopo aver avviato un terminale bash, ho notato che la variabile PATH contiene voci duplicate. Il mio terminale avvia una shell di login , quindi ~/.bash_profile
è di provenienza, seguito da ~/.profile
e ~/.bashrc
. Solo in ~/.profile
faccio creo le voci dei percorsi che sono duplicate.
Per essere pedanti, questo è l'ordine in cui i file che DOVREBBERO essere approvati vengono acquistati:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Prima che qualcuno lo contrassegni come duplicato di "La variabile PATH contiene duplicati", continua a leggere.
Inizialmente pensavo che questo avesse a che fare con la ~/.profile
provenienza due volte, quindi ho dovuto scrivere il file in un file di registro ogni volta che era di provenienza, e sorprendentemente ha registrato solo una voce, il che mi dice che è stata fornita una sola volta. Ancora più sorprendente è il fatto che quando commento le voci che erano in ~/.profile
, le voci appaiono ancora nella PATH
variabile. Ciò mi ha portato a tre conclusioni, una delle quali è stata rapidamente esclusa:
- Bash ignora i commenti bash validi ed esegue comunque il codice commentato
- Esiste uno script che legge
~/.profile
e ignora qualsiasi codice che stampa un output (ad esempio il file di registro) - C'è un'altra mia copia
~/.profile
che viene acquistata altrove
Il primo, ho rapidamente concluso di non essere il caso a causa di alcuni test rapidi. La seconda e la terza opzione sono quelle in cui ho bisogno di aiuto.
Come faccio a raccogliere un registro di script che vengono eseguiti all'avvio del mio terminale? Ho usato echo
nei file che ho controllato per sapere se sono stati originati da bash, ma ho bisogno di trovare un metodo conclusivo che traccia l'esecuzione fino al punto in cui il terminale è pronto per iniziare a digitare.
Se quanto sopra non è possibile, allora qualcuno può suggerire dove altro posso guardare per vedere quali script sono in esecuzione .
Referenza futura
Questo è lo script che ora uso per aggiungere al mio percorso:
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
Lo uso così:
add_to_path 'PATH' "/some/path/bin"
Lo script verifica se il percorso esiste già nella variabile prima di anteporlo.
Per gli utenti di zsh, puoi usare questo equivalente:
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
Modifica il 28/8/2018
Un'altra cosa che ho scoperto di poter fare con questo script è anche quella di correggere il percorso. Quindi all'inizio del mio .bashrc
file, faccio qualcosa del genere:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
Dipende da te cosa PATH
dovrebbe iniziare. Esaminare PATH
prima per decidere.
~/.profile
e ~/.bashrc
da~/.bash_profile
~/.profile
se~/.bash_profile
non esiste ...