Evitando duplicado entried em PATH (.cshrc)

3

Eu preciso prefixar os diretórios para a variável de caminho no meu arquivo .cshrc e quero ter certeza de que as entradas não sejam repetidas quando comparadas aos diretórios existentes na variável de caminho. Alguém pode aconselhar comandos adequados para isso? O caminho na minha máquina é : separado, não separado por espaço.

    
por astralsmith 30.05.2013 / 16:40

3 respostas

3

Se no Linux, suponho que seu csh seja tcsh . Então você deve ser capaz de fazer:

set -f path=("/new/entry" $path:q)

Em csh , tcsh e zsh , a variável $path special array está vinculada à variável $PATH ambiente escalar em que o elementos da matriz $path são construídos dividindo a variável $PATH no caractere de dois-pontos. Qualquer modificação de $path ou $PATH é automaticamente refletida na outra variável.

-f acima é para reter apenas a primeira entrada. $path:q são os elementos de $path , citados, que estão impedindo a divisão de palavras. Portanto, a sintaxe acima preenche o /new/entry ou o move para a frente, se já estava lá.

Por que você usaria csh ?

Nota: as aspas acima são necessárias. Ou, mais precisamente, todos os caracteres em /new/entry precisam ser citados de uma forma ou de outra.

set -f path=('/new/'\e"ntry" $path:q)

está OK.

set -f path=(/'new/entry' $path:q)

não é. Você sempre pode fazer isso em dois estágios:

set path=(/new/entry $path:q)
set -f path=($path:q)

(uma das razões pelas quais você pode querer ficar longe de csh )

    
por 30.05.2013 / 17:11
0

Eu acredito que o seguinte pode fazer o que você quiser.

if ( $PATH =~ */some/path* ) then
    set PATH = ($PATH:/some/path)
endif

Nota: eu sou mais de um usuário bash, por isso, se eu tiver um pequeno erro, deixe-me saber que csh if test

    
por 30.05.2013 / 16:51
0

(nota: eu não posso testar o abaixo agora mesmo ... espero que funcione)

Acabei de adicionar isso como um complemento à resposta de stephane: como se livrar de duplicatas no $ PATH

Eu suponho que você tenha

  • diretórios que devem ficar na frente
  • e outros diretórios também, ordem não importante (ou seja, colocada DEPOIS do acima)

então:

Para cancelar a duplicação de entradas:

UNIQUE_LIST=$( echo "$PATH" | tr ':' '\n' | sort | uniq)

# then we place in front those from UNIQUELIST that match an ordered list
# note that that way, those who didn't have "/sbin" still won't have it, but if they did
# it will be at the right place in the list
shouldbefirst="/bin /sbin /usr/bin" # complete or re-order as needed on your system...
for dir in $shouldbefirst
do
   if ( echo "$UNIQUE_LIST" | grep "$dir" >/dev/null 2>/dev/null)
   then #we have this dir in UNIQUE_LIST
      NEWLIST="${NEWLIST}:${dir}"
      UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
   fi
done

# then put the remaining of UNIQUE_LIST in the order you want (here, alphabetically)
for dir in $UNIQUE_LIST
do 
   NEWLIST="${NEWLIST}:${dir}"
   UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
done

 # get rid of possible first ":" (as NEWLIST starts empty)
 NEWLIST="$(echo "$NEWLIST" | sed -e 's/^://')"

 # and then : (I test by placing "echo" in front, get rid of "echo" if it looks fine)
 echo PATH="$NEWLIST"

(mais uma vez, não posso testar agora, mas espero que ajude)

NOTA: adicionarei recomendação: livre-se de "." no seu PATH, como será "colidido" até logo depois dos diretórios SHOULDBEFIRST ... ("." deve sempre ser evitado, e se usado, sempre em último lugar, para que você não possa facilmente ignorar comandos de / bin, / usr / bin, etc)

    
por 05.06.2013 / 17:22

Tags