evita entradas duplicadas em $ PATH

1

De maneira regular para adicionar um diretório ao PATH:

PATH=$PATH:/new-directory

Agora, o problema é que se você adicionar um novo diretório ao PATH, ele será adicionado sem verificar se ele já está no PATH ou não.

Por exemplo:

echo $PATH

dá:

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

Agora, se eu adicionar /usr/bin :

PATH=$PATH:/usr/bin

Então o PATH se torna:

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

Então, se você perceber, agora /usr/bin é repetido.

Então, como posso adicionar um novo diretório ao PATH sem repetir?

    
por Maythux 10.03.2014 / 13:25

3 respostas

4

Um jeito curto é usar:

[[ ":$PATH:" =~ ":/new-directory:" ]] || PATH="/new-directory:$PATH"

Explicações:

  • O primeiro comando, o comando condicional [[ , é para teste.
  • O operador =~ binário retorna 0 se a string da direita que é considerada uma expressão regular estendida corresponder à string da esquerda e 1 caso contrário.
  • Se o teste for não passado ( /new-directory foi não encontrado no PATH), graças ao operador de controle OR || lógico, o segundo comando é executado : PATH="/new-directory:$PATH" .

Observações:

  • Você sempre deve usar aspas quando atribuir uma string a uma variável, mesmo se a string for outra variável: PATH="/new-directory:$PATH" .
  • Em geral, é melhor adicionar um novo diretório à variável de ambiente PATH na frente de outros diretórios, e não depois de: PATH="/new-directory:$PATH" . Isso porque os diretórios no início do PATH têm precedência sobre os que vêm depois.
por Radu Rădeanu 10.03.2014 / 17:54
1

Você pode usar este comando:

if [[ ":$PATH:" != *":/new-directory:"* ]]; then PATH=${PATH}:/new-directory; fi

Agora, para o exemplo acima:

echo $PATH

dá:

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

Agora, se eu quiser adicionar / usr / bin:

if [[ ":$PATH:" != *":/usr/bin:"* ]]; then PATH=${PATH}:/usr/bin; fi

Você pode perceber que o PATH não muda:

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

agora para adicionar outro exemplo de diretório / var / www

if [[ ":$PATH:" != *":/var/www:"* ]]; then PATH=${PATH}:/var/www; fi

Em seguida, a saída de echo $PATH fornece:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/www
    
por Maythux 10.03.2014 / 13:25
1

Eu uso o bash_path_funcs de Stephen Collyer, descrito no Linux Journal em 2000:

http://www2.linuxjournal.com/lj-issues/issue71/3645.html  
http://www2.linuxjournal.com/lj-issues/issue72/3768.html  
http://www2.linuxjournal.com/lj-issues/issue73/3935.html  

A função addpath adiciona uma entrada a um caminho somente se ele não estiver lá em primeiro lugar. delpath -n exclui todos os diretórios inexistentes de um caminho.

Meu mal, eu usei links na minha resposta, mas os links fizeram o que eles sempre fazem - eles foram embora. Você pode obter o arquivo pathfunc.tgz do link

    
por waltinator 03.04.2014 / 17:09