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
si~/.bash_profile
n'existe pas ...~/.profile
et~/.bashrc
de~/.bash_profile
Réponses:
Si votre système en dispose,
strace
vous pouvez lister les fichiers ouverts par le shell, par exemple en utilisant(
-li
signifie shell de connexion interactif; à utiliser uniquement-i
pour un shell interactif sans connexion.)Cela affichera une liste de fichiers que le shell a ouvert ou essayé d'ouvrir. Sur mon système, ils sont les suivants:
/etc/profile
/etc/profile.d/*
(divers scripts en/etc/profile.d/
)/home/<username>/.bash_profile
(cela échoue, je n'ai pas un tel fichier)/home/<username>/.bash_login
(cela échoue, je n'ai pas un tel fichier)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(historique des lignes de commande; ce n'est pas un script)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(divers scripts fournissant une fonctionnalité de saisie semi-automatique)/etc/inputrc
(définit les raccourcis clavier; ce n'est pas un script)Utilisez
man strace
pour plus d'informations.la source
echo $0
dans le terminal donne-bash
plutôt que prévubash
. Avez-vous d'autres suggestions à ce sujet?$0
est un tiret-
, ou lorsqu'il est invoqué avec l'option-l
.echo PATH=\""$PATH"\"
au début et à la fin de.profile
et.bashrc
? Et pourquoi ne faites-vous pas ce que tout le monde fait et définissez le PATH soit complètement, soit, si vous ajoutez un répertoire, gardezecho ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
:?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
sur macOS. (il suffit de remplacerstrace
pardtruss
)