Je source bashrc de quelques-uns de mes amis. Je finis donc par avoir des entrées en double dans ma variable $ PATH. Je ne suis pas sûr que ce soit le problème pour les commandes dont le démarrage est long. Comment fonctionne $ PATH en interne dans bash? Avoir plus de PATHS ralentit-il mon temps de démarrage?
45
zsh
, c'est aussi simple quetypeset -aU path
, FWIW .Réponses:
Avoir plus d'entrées
$PATH
ne ralentit pas directement votre démarrage, mais cela ralentit à chaque fois que vous exécutez une commande particulière dans une session shell (pas à chaque fois que vous exécutez la commande, car bash conserve un cache). Le ralentissement est rarement perceptible sauf si vous avez un système de fichiers particulièrement lent (par exemple, NFS, Samba ou un autre système de fichiers réseau, ou sur Cygwin).Les entrées en double sont également un peu gênantes lorsque vous examinez votre
$PATH
visuel, vous devez parcourir plus cruellement.Il est assez facile d'éviter d'ajouter des entrées en double.
Note secondaire: rechercher le script shell de quelqu'un d'autre signifie exécuter le code qu'il a écrit. En d'autres termes, vous donnez à vos amis l'accès à votre compte quand ils le souhaitent.
Remarque secondaire:
.bashrc
n’est pas le bon endroit pour définir$PATH
ou toute autre variable d’environnement. Les variables d'environnement doivent être définies dans~/.profile
. Voir Quels fichiers de configuration doivent être utilisés pour configurer les variables d'environnement avec bash? , La différence entre .bashrc et .bash_profile .la source
case :$PATH:
et pascase $PATH
pour qu'il corresponde même si l'entrée est première ou dernière.J'ai vu des personnes nettoyer les doublons de leur variable PATH en utilisant
awk
et quelque chose comme ceci:Vous pouvez essayer d’ajouter cela à votre propre base et vous assurer que vous sourcez les autres fichiers quelque part avant de l’exécuter.
Une alternative serait d'utiliser l'
pathmerge
utilitaire.En ce qui concerne votre problème de vitesse, cela n’affectera pas le temps de démarrage du shell de manière significative, mais vous gagnerez peut-être du temps pour compléter les commandes, en particulier lorsque la commande n’est pas trouvée dans le chemin et qu’elle effectue des recherches répétées dans le même sens. dossiers à la recherche.
Un mot sur la sécurité: Vous devriez vraiment écouter les avertissements de Gilles sur la sécurité ici. En recherchant un fichier appartenant à un autre utilisateur, vous donnez un laissez-passer gratuit à ces utilisateurs pour qu'ils exécutent leur propre code en tant qu'utilisateur chaque fois que vous démarrez un shell. Si vous ne faites pas confiance à ces utilisateurs avec votre mot de passe, vous ne devriez pas rechercher leurs fichiers shell.
la source
PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')
:
n'est pas qu'une question esthétique. Cela revient à ajouter.
à votre chemin, ce qui est potentiellement dangereux.Basé sur la réponse de @Gilles, vous pouvez l'envelopper dans une fonction pour minimiser la frappe:
la source
Seule la première correspondance de
$PATH
est exécutée, les entrées suivantes ne sont pas traitées par la suite. C'est pourquoi vous devez parfois modifier l'ordre des entrées dans$PATH
votre environnement afin que votre environnement se comporte comme prévu.Pour répondre à votre question: cela ne devrait pas être la cause d'un démarrage lent.
la source
TAB
? Dans ce cas, vous devriez vérifier si votre définition complète ne ressemble pascomplete -c which -a
. Vous devez supprimer le-a
paramètre. Vous pouvez vérifier que en exécutant la commande:complete | grep which
.Pour éviter les entrées en double dans mon PATH, je devais mettre les éléments suivants dans BOTH ~ / .bash_profile et ~ / .bashrc:
L'inconvénient principal est qu'il trie les entrées de PATH, mais je pense pouvoir vivre avec cela.
la source