J'essaie de compiler wxWidgets en utilisant MingW, et j'ai cygwin sur mon chemin, ce qui semble être en conflit. Je voudrais donc supprimer /d/Programme/cygwin/bin
de la variable PATH et je me demande s'il existe une manière élégante de le faire.
L'approche naïve serait de l'écho dans un fichier, de le supprimer manuellement et de le source, mais je parie qu'il y a une meilleure approche à cela.
bash
shell
environment-variables
path
Devolus
la source
la source
Réponses:
Il n'y a pas d'outils standard pour "éditer" la valeur de $ PATH (c'est-à-dire "ajouter un dossier uniquement lorsqu'il n'existe pas déjà" ou "supprimer ce dossier"). Vous exécutez simplement:
ce serait pour la session en cours, si vous voulez changer de façon permanente, ajoutez-le à n'importe quel .bashrc, bash.bashrc, / etc / profile - tout ce qui convient à votre système et aux besoins des utilisateurs. Cependant, si vous utilisez BASH, vous pouvez également effectuer les opérations suivantes si, disons, vous souhaitez supprimer le répertoire
/home/wrong/dir/
de votre variable PATH, en supposant qu'il se trouve à la fin:Donc, dans votre cas, vous pouvez utiliser
la source
/
avec quelque chose comme|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
pour empêcher tout échappement.En bash:
Si vous n'utilisez pas de variable intermédiaire, vous devez protéger les
/
caractères du répertoire à supprimer afin qu'ils ne soient pas traités comme la fin du texte de recherche.La première et la troisième ligne sont là pour faire en sorte que chaque composant du chemin de recherche soit entouré
:
, pour éviter de mettre en casse spéciale le premier et le dernier composant. La deuxième ligne supprime le composant spécifié.la source
Après avoir examiné les autres options présentées ici et ne pas avoir compris comment certaines d'entre elles fonctionnaient, j'ai développé ma propre
path_remove
fonction, que j'ai ajoutée à ma.bashrc
:Cela s'est avéré assez proche de la solution de Gilles mais s'est présenté comme une fonction bash qui pourrait être facilement utilisée sur la ligne de commande.
Il a les avantages qu'en tant que fonction bash, il fonctionne comme un programme sans avoir besoin d'être un programme sur le chemin, et il ne nécessite aucun programme externe pour s'exécuter, juste une manipulation de chaîne bash.
Il semble assez robuste, en particulier il ne se transforme pas
somepath:mypath/mysubpath
ensomepath/mysubpath
: si vous exécutezpath_remove mypath
, ce qui était un problème que j'ai eu avec mapath_remove
fonction précédente .Une excellente explication du fonctionnement de la manipulation de chaînes bash peut être trouvée dans le Guide avancé de Bash-Scripting .
la source
Donc, en combinant les réponses de @gilles et @ bruno-a (et quelques autres astuces sed), j'ai trouvé ce one-liner, qui supprimera (chaque) REMOVE_PART de PATH, qu'il se produise au début, milieu ou fin de CHEMIN
C'est un peu lourd, mais c'est agréable de pouvoir le faire en un seul coup. Le
;
est utilisé pour réunir les deux commandes sed distinctes:s@:$REMOVE_PART:@:@g
(qui remplace:$REMOVE_PART:
par un seul:
)s@^:\(.*\):\$@\1@
(qui supprime les deux-points avant et arrière que nous avons ajoutés avec la commande echo)Et dans le même ordre d'idées, je suis juste parvenu à trouver cette doublure pour ajouter un ADD_PART au PATH, uniquement si le PATH ne le contient pas déjà
Remplacez la dernière partie par
echo "$PATH:$ADD_PART"
si vous souhaitez ajouter ADD_PART à la fin de PATH plutôt qu'au début....
... ou pour rendre cela encore plus facile, créez un script appelé
remove_path_part
avec le contenuet un script appelé
prepend_path_part
avec le contenuet un script appelé
append_path_part
avec le contenurendez-les tous exécutables, puis appelez-les comme:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Bien, même si je le dis moi-même :-)
la source
Une doublure beaucoup plus simple.
la source
C'est un exercice intéressant d'écrire une fonction bash pour supprimer un répertoire d'une variable de chemin.
Voici quelques fonctions que j'utilise dans mes fichiers .bash * pour ajouter / ajouter des répertoires aux chemins. Ils ont le mérite de supprimer les entrées en double, le cas échéant, et fonctionnent avec tout type de variable de chemin séparé par deux points (PATH, MANPATH, INFOPATH, ...). la fonction remove_from supprime le répertoire.
la source
Voici le code révisé de la solution de Greg Tarsa. Seules les commandes intégrées bash sont utilisées ici. Ainsi, cela économisera beaucoup d'appels système fork ().
la source
Pour compléter / améliorer la réponse acceptée de Tushar, vous pouvez:
-e
option, conformément à la page de manuel sed : "Si aucune option -e, --expression, -f ou --file n'est donnée, le premier argument de non-option est considéré comme le script sed à interpréter."g
indicateur (global) pour supprimer toutes les occurrencesEn fin de compte, cela donne quelque chose comme ceci:
la source
Les réponses actuelles ne résolvent pas mon problème similaire en ce sens que je dois supprimer plusieurs chemins. Tous ces chemins sont des sous-répertoires d'un seul répertoire. Dans ce cas, ce one-liner fonctionne pour moi: (supposons que le motif soit
cygwin
, c'est-à-dire, en supprimant tous les chemins qui contiennentcygwin
)la source