Possível adicionar todos os subdiretórios ao adicionar um diretório ao $ PATH

7

Ao adicionar algum diretório ao $ PATH por PATH = ~ / my_program / bin: ”$ {PATH}”

  1. é verdade que apenas executáveis diretamente sob o diretório será encontrado via $ PATH, mas outros executáveis sob seus subdirectores não vai?
  2. é possível fazer todos os seus subdiretórios adicionados? As vezes especificar todos os subdiretórios explicitamente pode ser muito trabalho quando há muitos.

Obrigado e cumprimentos!

    
por Tim 03.04.2011 / 06:34

4 respostas

5

Este script usa tree ...

  • sudo apt-get install tree

Você pode alterar a profundidade dos diretórios alterando -L 1
e você pode escolher usar ou não ~/ ...

UPDATE 2 :
.. modificou o script para substituir apenas um leading / home / user / (não "any")
.. e adicionou args ..

UPDATE Verificação adicionada: .. Não adicione diretório ao PATH quando ele já estiver no PATH .. Esta verificação considera '~ /' e '/ home / user /' diferentes.

Re sua pergunta 1 ... sim é verdade; cada diretório específico deve ser spedificado individualmente no PATH.

Re sua pergunta 2 ... Aqui está um script que vai fazer o que quiser ...
Eu testei, mas como está, ele fará o novo PATH para a sessão atual ..
Para torná-lo permanente, você pode usar export PATH (mas estou um pouco esboçado nos detalhes de export )

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="" # valid mode values: "tilde", or  anything else   
maindir=""; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L  -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo
    
por Peter.O 03.04.2011 / 14:23
2

Não é possível, porque os sistemas baseados em UNIX não são projetados para funcionar assim. Normalmente, todos os arquivos executáveis são colocados em um pequeno número de diretórios. Por exemplo, todas as coisas que eu escrevo para meus propósitos vão em ~ / bin.

Se você não quiser que seus binários e scripts reais vivam em um diretório bin, você pode criar um symlink em, por exemplo, ~ / bin para o binário real.

Ter todos os subdiretórios em $ PATH não é particularmente desejável, já que apenas adiciona mais diretórios para pesquisa, aumenta o risco de outros executáveis entrarem em seu PATH que não deveriam estar lá, e realmente não dá muito benefício.

    
por Scott Severance 03.04.2011 / 12:32
2

Isso deve fazer o trabalho

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

Por favor, leve em consideração que

  • Toda a árvore de diretórios será percorrida, o que pode levar algum tempo, então tente manter a hierarquia pequena.
  • Isso não levará em consideração os diretórios criados depois que o PATH estiver definido.
  • Se você invocar isso várias vezes, haverá muitas duplicatas no PATH. Você pode querer atribuir o PATH original a alguma variável temporária (por exemplo, OLD_PATH).
por Adam Byrtek 03.04.2011 / 12:49
1

Não, não é possível de maneira fácil. Seria uma possibilidade adicionar softlinks a todos os executáveis para "~ / my_program / bin"?

    
por ddeimeke 03.04.2011 / 08:44