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
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
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à
PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi')
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 contenu
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
et un script appelé prepend_path_part
avec le contenu
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
et un script appelé append_path_part
avec le contenu
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
rendez-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 :-)