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

15

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

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

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

que não é fácil de ler.

Existe uma maneira de definir ou adicionar caminhos à variável PATH usando uma sintaxe multilinha ? Talvez usando matrizes? Eu estou procurando por algo assim:

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

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

    
por Amelio Vazquez-Reina 08.02.2012 / 15:51

4 respostas

11

Eu não sei se funciona em zsh, mas funciona no bash:

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

Editar 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 importantes em torno de $PATH , $IFS , ${new_path[*]} e $OLD_IFS para manter espaços nas variáveis e evitar interpretação de shell do IFS.

Update2 com comentários e gerenciamento de linha vazio 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 tabulações antes de comentários e linhas vazias, use sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'d (guias a serem testadas, pois podem ser específicas da implementação sed).

    
por 08.02.2012 / 16:19
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
    
por 08.02.2012 / 16:12
11

Em zsh, $path é uma matriz:

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

Nota: o path é minúsculo.

    
por 25.04.2013 / 11:34
7

Em 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)

Portável: Como adicionar corretamente um caminho ao PATH?

Você pode usar qualificadores para excluir entradas que não sejam diretórios existentes ou simbólicas links 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 sintaxe path+=/my/path porque o lado direito está em um contexto de string e, portanto, não passa por globbing; você pode fazer isso com path+=(/my/path) , pois cada elemento da matriz é expandido em um contexto de lista.

path+=(/path/to/app/{i386,share}/bin(-/N))
    
por 09.02.2012 / 01:50