Après avoir démarré un terminal bash, j'ai remarqué que la variable PATH contient des entrées en double. Mon terminal démarre un shell de connexion , il ~/.bash_profile
est donc d' origine, suivi de ~/.profile
et ~/.bashrc
. Ce n'est qu'en ~/.profile
créant les entrées de chemins qui sont dupliquées.
Pour être pédant, c'est l'ordre dans lequel les fichiers qui DEVRAIENT être sourcés sont sourcés:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Avant que quiconque ne marque cela comme un doublon de "la variable PATH contient des doublons", continuez à lire.
Au début, je pensais que cela avait à voir avec le fait d' ~/.profile
avoir été sourcé deux fois, j'ai donc dû écrire le fichier dans un fichier journal chaque fois qu'il était sourcé, et étonnamment, il n'a enregistré qu'une seule entrée, ce qui me dit qu'il n'a été sourcé qu'une seule fois. Encore plus surprenant est le fait que lorsque je commente les entrées qui étaient ~/.profile
, les entrées apparaissent toujours dans la PATH
variable. Cela m'a conduit à trois conclusions, dont l'une a été rapidement écartée:
- Bash ignore les commentaires bash valides et exécute toujours le code commenté
- Il existe un script qui lit le
~/.profile
et ignore tout code qui imprime une sortie (le fichier journal par exemple) - Il y a une autre copie de mon
~/.profile
qui est achetée ailleurs
Le premier, j'ai rapidement conclu que ce n'était pas le cas en raison de tests rapides. Les deuxième et troisième options sont celles où j'ai besoin d'aide.
Comment rassembler un journal des scripts qui sont exécutés au démarrage de mon terminal? J'ai utilisé echo
dans les fichiers que j'ai vérifiés pour savoir s'ils provenaient de bash, mais je dois trouver une méthode concluante qui retrace l'exécution jusqu'au moment où le terminal est prêt pour que je commence à taper dedans.
Si ce qui précède n'est pas possible, quelqu'un peut-il suggérer où je peux chercher pour voir quels scripts sont exécutés .
Référence future
Voici le script que j'utilise maintenant pour ajouter à mon chemin:
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
}
Je l'utilise comme ceci:
add_to_path 'PATH' "/some/path/bin"
Le script vérifie si le chemin existe déjà dans la variable avant de l'ajouter.
Pour les utilisateurs de zsh, vous pouvez utiliser cet équivalent:
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
}
Modifier le 28/8/2018
Une autre chose que j'ai trouvé que je pouvais faire avec ce script est de corriger également le chemin. Donc au début de mon .bashrc
dossier, je fais quelque chose comme ça:
_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
C'est à vous de décider par quoi PATH
commencer. Examinez d' PATH
abord pour décider.
~/.profile
et ~/.bashrc
de~/.bash_profile
~/.profile
si~/.bash_profile
n'existe pas ...