Estou tentando compilar wxWidgets usando MingW e tenho cygwin no meu caminho, o que parece entrar em conflito. Então, eu gostaria de remover /d/Programme/cygwin/bin
da variável PATH e me pergunto se existe alguma maneira elegante de fazer isso.
A abordagem ingênua seria fazer eco em um arquivo, removê-lo manualmente e fonte-lo, mas eu aposto que há uma abordagem melhor para isso.
bash
shell
environment-variables
path
Devolus
fonte
fonte
Respostas:
Não há ferramentas padrão para "editar" o valor de $ PATH (por exemplo, "adicionar pasta apenas quando ainda não existir" ou "remover esta pasta"). Você acabou de executar:
isso seria para a sessão atual, se você quiser alterá-lo permanentemente, adicione-o a qualquer perfil .bashrc, bash.bashrc, / etc / profile - o que for adequado ao seu sistema e às necessidades do usuário. No entanto, se você estiver usando o BASH, também poderá fazer o seguinte se, digamos, você desejar remover o diretório
/home/wrong/dir/
da sua variável PATH, supondo que esteja no final:Então, no seu caso, você pode usar
fonte
/
com algo como|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
para evitar toda a fuga.Na festança:
Se você não usar uma variável intermediária, precisará proteger os
/
caracteres no diretório para remover, para que não sejam tratados como o final do texto da pesquisa.A primeira e a terceira linha estão lá para organizar todos os componentes do caminho de pesquisa a serem cercados
:
, para evitar o revestimento especial do primeiro e do último componente. A segunda linha remove o componente especificado.fonte
Depois de considerar outras opções apresentadas aqui, e sem entender completamente como algumas delas funcionavam, desenvolvi minha própria
path_remove
função, que adicionei à minha.bashrc
:Isso acabou bem perto da solução de Gilles, mas foi encerrado como uma função bash que poderia ser facilmente usada na linha de comando.
Tem as vantagens de que, como uma função bash, funciona como um programa sem precisar ser um programa no caminho, e não requer a execução de programas externos, apenas a manipulação do bash string.
Parece bastante robusto, em particular, não se transforme
somepath:mypath/mysubpath
emsomepath/mysubpath
: se você executarpath_remove mypath
, o que era um problema que eu tive com o meu anteriorpath_remove
função.Uma excelente explicação de como funciona a manipulação de string bash pode ser encontrada no Advanced Bash-Scripting Guide .
fonte
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
É 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.
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údoe um script chamado
prepend_path_part
com o conteúdoe um script chamado
append_path_part
com o conteúdotorne-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 :-)
fonte
Um forro muito mais simples.
fonte
É um exercício interessante escrever uma função bash para remover um diretório de uma variável de caminho.
Aqui estão algumas funções que eu uso nos meus arquivos .bash * para acrescentar / acrescentar diretórios aos caminhos. Eles têm a virtude de remover entradas duplicadas, se houver, e funcionam com qualquer tipo de variável de caminho separado por dois pontos (PATH, MANPATH, INFOPATH, ...). a função remove_from remove o diretório
fonte
Abaixo estão os códigos revisados da solução de Greg Tarsa. Somente comandos bash build-in são usados aqui. Assim, ele economizará muitas chamadas de sistema fork ().
fonte
Para concluir / melhorar a resposta aceita de Tushar, você pode:
-e
opção, de acordo com a página do manual sed : "Se nenhuma opção -e, --expression, -f ou --file for fornecida, o primeiro argumento de não opção será usado como o script sed para interpretar."g
sinalizador (global) para remover todas as ocorrênciasNo final, fornece algo parecido com isto:
fonte
As respostas atuais não resolvem meu problema semelhante, pois preciso remover vários caminhos. Todos esses caminhos são subdiretórios de um único diretório. Nesse caso, essa linha única funciona para mim: (suponha que o padrão esteja
cygwin
removendo todos os caminhos que contêmcygwin
)fonte