Adicionando caminhos ao PATH usando uma sintaxe de várias linhas


16

Pelo que entendi, a maneira usual de adicionar um caminho à PATHvariável de ambiente é concatenando caminhos separados pelo :caractere.

Por exemplo, se eu quiser adicionar três caminhos a ele /my/path/1, /my/path/2e /my/path/3, eu teria que fazê-lo da seguinte forma:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

o que não é fácil de ler.

Existe uma maneira de definir ou adicionar caminhos à PATHvariável usando uma sintaxe de várias linhas ? Talvez usando matrizes? Estou procurando algo parecido com isto:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

Caso existam soluções interessantes específicas do shell, estou procurando uma solução no zsh.

Respostas:


12

Não sei se funciona no zsh, mas funciona no bash:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

Edite e ainda mais curto:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

E sem gerar um processo:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

As aspas duplas são espalhados importante $PATH, $IFS, ${new_path[*]}e $OLD_IFSpara manter espaços na interpretação variáveis e evitar shell de IFS.

Atualização2 com comentários e gerenciamento de linha vazia usando sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

O caractere de comentário deve ser o primeiro caractere na linha e as linhas vazias devem estar completamente vazias. Para gerenciar espaços e guias antes do comentário e em linhas vazias, use sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'d(guias a serem testadas, pois podem ser específicas à implementação sed).


Testei o último trecho no zsh e ele funciona. Também gosto que é um pouco mais limpo (um caminho por linha) do que as outras soluções. A solução pode acomodar linhas comentadas (caminhos)? E as linhas vazias?
Amelio Vazquez-Reina

Atualize com comentários e gerenciamento de linha vazia.
Jfg956

E com o sed, se você quiser jogar, pode evitar o processo de colar com um script mais complicado.
Jfg956

Tudo bem usar recuo para os caminhos na pastesolução?
Julio

20

Não é uma solução interessante, mas muito portátil:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

11
Isso é típico do que eu vi ao longo dos anos. Pode-se reordenar facilmente os caminhos ou até alterar um elemento para ser PATH = / my / path / 1: $ {PATH} para forçar o prefixo.
BSD

11
Você também pode usar +=para evitar a necessidade de reconstruir completamente a sequência.
22420 Chris Down

E você nem precisa usar o aparelho. Dois pontos não podem ser usados ​​em nomes de variáveis ​​de ambiente, portanto não há ambiguidade a ser resolvida.
Alexs

+1 por não ser interessante. Interessante pode ser bom às vezes, mas esse não é um daqueles momentos! (Especialmente porque o OP mencionou explicitamente "não é fácil de ler" como um problema).)
Ruakh

@ChrisDown Existe uma sintaxe que precede sem reconstruir a string?
John P

12

No zsh, $pathé uma matriz:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

Nota: ambos pathsão minúsculos.


Isso depende do shell, nem todos lidam com isso.
vonbrand

11
@ vonbrand: Sim, mas funciona no zsh. Eu acho que vale a pena mencionar.
Kabie #

3
+1 (Esta questão é marcado zsh )
Johnsyweb

Como o OP perguntou especificamente sobre o zsh, essa é a melhor opção #
Daniel Serodio

11
Para quem estiver interessado em aprender mais sobre o $ caminho vs. $ distinção PATH confira este post
mbigras

7

No zsh, se você estiver adicionando diretórios no final do caminho:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Portably: Como adicionar corretamente um caminho ao PATH?

Você pode usar qualificadores glob para excluir as entradas que não são existentes diretórios ou links simbólicos para tal. Isso pode ou não ser desejável, dependendo se você espera que os diretórios sejam adicionados posteriormente durante a sessão (por exemplo, se estiverem em sistemas de arquivos remotos). Você não pode fazer isso com a path+=/my/pathsintaxe, porque o lado direito está em um contexto de string e, portanto, não sofre globs; você pode fazer isso path+=(/my/path)porque cada elemento da matriz é expandido em um contexto de lista.

path+=(/path/to/app/{i386,share}/bin(-/N))
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.