Então, combinando as respostas de @gilles e @ bruno-a (e alguns outros truques de sed), criei essa linha única, que removerá (todos) REMOVE_PART do PATH, independentemente de ocorrer no início, meio ou fim do caminho
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
É um pouco pesado, mas é bom poder fazer isso em um único hit. O ;
é usado para unir os dois comandos sed separados:
s@:$REMOVE_PART:@:@g
(que substitui :$REMOVE_PART:
por um único :
)
s@^:\(.*\):\$@\1@
(que retira os dois pontos iniciais e finais que adicionamos com o comando echo)
E de maneira semelhante, eu apenas consegui criar essa linha para adicionar um ADD_PART ao PATH, apenas se o PATH ainda não o contiver.
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')
Altere a última parte para echo "$PATH:$ADD_PART"
se você deseja adicionar ADD_PART ao final de PATH em vez de ao início.
...
... ou para facilitar ainda mais, crie um script chamado remove_path_part
com o conteúdo
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
e um script chamado prepend_path_part
com o conteúdo
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
e um script chamado append_path_part
com o conteúdo
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
torne-os todos executáveis e, em seguida, chame-os como:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Legal, mesmo que eu diga :-)