Adicionando uma nova entrada à variável PATH no ZSH


188

Estou usando o zsh e estou tentando adicionar uma nova entrada ( /home/david/pear/bin) à PATHvariável, mas não sei como.

O que mais me confunde é que não há uma única referência a uma PATHvariável no meu ~/.zshrcarquivo, mas echo $PATHretornos:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Portanto, uma PATHvariável está sendo definida em algum lugar.

Respostas:


213

Aqui, adicione esta linha a .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDIT : Isso funciona, mas a resposta de ony abaixo é melhor, pois tira proveito da interface estruturada que o ZSH fornece para variáveis ​​como $PATH. Essa abordagem é padrão para bash, mas até onde eu sei, não há razão para usá-la quando o ZSH fornece melhores alternativas.


29
haha esquecê-lo, eu pensei que era apenas um comando do console, mas adicionar essa linha ao .zshrc fez o truque. Muito obrigado!
David Barreto

1
Meu .zshrc já tinha uma linha para exportação PATH, então substituí-a pelo modificado.
Zack Huston

6
Eu tive que remover as aspas duplas nas entradas, ou seja, PATH="/home/david/pear/bin:/usr/bin:etc"para PATH=/home/david/pear/bin:/usr/bin:etcque ele permanecesse no zshrc.
a7omiton

3
@taco, você pode usar $ HOME
mencargo 10/11/2015

1
@DanielSpringer: Sim. Quando você abre um shell, ele herda PATHdo processo pai que o iniciou e, em seguida, quando é executado .zshrc( .bashrcou qualquer outra coisa), é isso que permite adicionar itens adicionais a esse caminho.
Linuxios 18/11/19

224

Na verdade, o uso do ZSH permite o uso de mapeamento especial de variáveis ​​de ambiente. Então você pode simplesmente fazer:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Para mim, esse é um recurso muito interessante que pode ser propagado para outras variáveis. Exemplo:

typeset -T LD_LIBRARY_PATH ld_library_path :

16
Boa resposta. No meu caso, ~/.zshrcé originada depois .profilee substitui tudo .profile. Demorei um pouco puxando meu cabelo para descobrir.
precisa

1
O caso de acréscimo não precisa de parênteses, a menos que você esteja anexando mais de um elemento. Muitas vezes, também não precisa das aspas. Assim, o simples, curto maneira de acrescentar é
Micah Elliott

1
@SuperUberDuper, você deve entender que quase qualquer shell unix simplesmente lê arquivos de inicialização que fazem quase o mesmo que se você digitasse no shell interativamente. Em relação a arquivos "RC" que você pode encontrar resposta interessante a essa pergunta
ony

6
É possível evitar a exportação explícita com -xe deixar apenas valores exclusivos em uma variável com -U, dois pontos é assumido por padrão, para que possa ser:typeset -TUx PATH path
Grief

2
@DanielSpringer, não. Se você quiser nesses termos, então: path=(...)(sem referência $pathou $PATHdentro) atribui, acrescenta path=(... $path)e path+(...)acrescenta.
ony

40

Você pode anexar ao seu PATHde uma maneira mínima. Não há necessidade de parênteses, a menos que você esteja anexando mais de um elemento. Também geralmente não precisa de aspas. Portanto , a maneira simples e curta de acrescentar é:

path+=/some/new/bin/dir

Uso comum

Em seguida, o padrão comum para testar um novo script / executável se torna:

path+=$PWD/.
# or
path+=$PWD/bin

Essa sintaxe em minúscula está sendo usada pathcomo uma matriz , mas também afeta seu equivalente de parceiro em maiúsculas PATH(ao qual está "ligado" via typeset).

(Observe que não :é necessário / desejado como separador .)

Petiscos relacionados

Tratar pathdessa maneira (como uma matriz) também significa: não é necessário fazer a rehash para obter os comandos recém-localizados.

Veja também vared pathcomo uma maneira dinâmica de editarpath e outras coisas.

Você pode estar interessado apenas pathnessa questão, mas, como estamos falando de exportações e matrizes, observe que as matrizes geralmente não podem ser exportadas.

Você pode até impedir PATHa entrada de entradas duplicadas (consulte isto e isto ):

typeset -U path

Não deve ser 'path + =: / foo / bar'? (com dois pontos)
andrew lorien

1
@andrewlorien Atualizei a resposta com detalhes sobre o separador de dois pontos.
Micah Elliott

Observe que, se houver um comentário após o caminho, precisamos de aspas, como path+='my/path' # for fun. É óbvio se você tiver espaços, mas não tanto se tiver comentários.
Franklin Yu

"(Observe que não: é necessário / desejado como um separador.)" Isso é verdade apenas para letras minúsculas path. :É necessário um precedente para PATH, da seguinte maneira em .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.

37

um forro, sem abrir ~/.zshrcarquivo

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

ou

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Para ver o efeito, faça source ~/.zshrcna mesma guia ou abra uma nova guia


1
Trabalhou perfeitamente no OSX com shell Zsh.
Stryker

1
Trabalhou como um encanto!
Akbar Sha Ebrahim

14
  1. Caminho adicionado para ~ / .zshrc

    sudo vi ~/.zshrc

    adicionar novo caminho

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Atualizar ~ / .zshrc

    Salvar ~ / .zshrc

    source ~/.zshrc

  3. Verificar PATH

    echo $PATH


2
Este é o Bashcaminho.
CousinCocaine

13

OPÇÃO 1: adicione esta linha a ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Depois disso, você precisa executar source ~/.zshrcpara que suas alterações tenham efeito OU feche esta janela e abra uma nova

OPÇÃO 2: execute-o dentro do console do terminal para adicionar esse caminho apenas à sessão atual da janela do terminal. Quando você fecha a janela / sessão, ela será perdida.


Você pode explicar como essa resposta é diferente da mesma resposta postada 5 anos atrás ?
Franklin Yu

nesta resposta, não é dito que você deve adicionar esta linha de código ao arquivo; se você a executar dessa maneira, ela mudará apenas nas janelas atuais e isso não será explicado na resposta original
Dimitar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.