Existe uma maneira de adicionar um diretório ao meu PATH no zsh apenas se ele ainda não estiver presente?

15

Existe uma maneira fácil no zsh de adicionar um diretório ao meu PATH apenas se ele ainda não estiver presente? (ou, geralmente, qualquer variável de ambiente). Eu tentei:

PATH+=/my/directory

... mas se for executado duas vezes, será adicionado duas vezes.

Andrew Ferrier
fonte
2
@uther, isso não é uma duplicata, já que a outra pergunta era para o bash, enquanto essa é para o zsh, que tem sua própria maneira de resolver esse problema.
Stéphane Chazelas

Respostas:

32

In zsh $PATHestá vinculado (consulte typeset -T) à $pathmatriz. Você pode forçar essa matriz a ter valores exclusivos com:

typeset -U path

E então, adicione o caminho com:

path+=(~/foo)

Sem ter que se preocupar se já estava lá.

Para adicioná-lo à frente, faça:

path=(~/foo "$path[@]")

ou:

path[1,0]=~/foo

se ~/foojá estava $pathlá, ele será movido para a frente.

Stéphane Chazelas
fonte
Você não quer dizer typeset -Ug path? Quando eu uso typeset -U pathno meu ~/.zshrcarquivo, eu sempre voltar um erro sobre nada estar no caminho enquanto o zshrc está em execução
kalbasit
@eMxyzptlk, estranho. -gé evitar restringir o escopo, mas ~/.zshrco escopo já é global. Além disso, eu nunca vi zshreclamar de um vazio $PATH(exceto o comando não encontrou erros, é claro).
Stéphane Chazelas
3

Adicione export -U PATH=~/foo${PATH:+:$PATH}a um dos seus arquivos de inicialização. O -Umantém apenas a primeira ocorrência de um valor em matrizes ou certas :variáveis delimitadas como PATH.

llua
fonte
-3

Você terá que fazer algo como:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Isso funciona apenas se newpathfor delimitado por dois ':', é necessário considerar os casos em que está no início ou no final da mesma forma.

Urgh.

vonbrand
fonte
1
Você pode fazer isso dentro do shell, apenas com os recursos Bourne / POSIX. Isso evita citar dores de cabeça (pelo menos faça isso echo "$PATH": sempre coloque aspas duplas em torno de substituições de variáveis ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles 'SO- stop be evil'