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

8

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

  1. é verdade que apenas os executáveis ​​diretamente no diretório serão encontrados via $ PATH, mas outros executáveis ​​nos subdiretórios não serão?
  2. é possível adicionar todos os seus subdiretórios? Às vezes, especificar todos os subdiretórios explicitamente pode dar muito trabalho quando houver muitos.

Obrigado e cumprimentos!

Tim
fonte

Respostas:

5

Este script usa tree...

  • sudo apt-get install tree

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

ATUALIZAÇÃO 2 :
.. modificou o script para substituir apenas um líder / home / usuário / (não "any")
.. e adicionou argumentos.

ATUALIZAÇÃO Verificação adicionada: .. Não adicione o diretório ao PATH quando já estiver no PATH. Essa verificação considera '~ /' e '/ home / user /' diferentes.

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

Re sua pergunta 2 ... Aqui está um script que fará o que você deseja ..
Eu testei, mas como está, ele criará o novo PATH para a sessão atual.
Para torná-lo permanente, você pode usar export PATH(mas Estou um pouco superficial 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="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; 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 $3 -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
Peter.O
fonte
3

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

Se você não deseja que seus binários e scripts reais residam em um diretório bin, você pode criar um link simbólico em, por exemplo, ~ / bin para o binário real.

Ter todos os subdiretórios em $ PATH não é particularmente desejável, pois apenas adiciona mais diretórios à pesquisa, aumenta o risco de outros executáveis ​​entrarem no seu PATH que não deveriam estar lá e realmente não traz muitos benefícios.

Scott Severance
fonte
3

Isso deve fazer o trabalho

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

Por favor, leve em consideração que

  • A árvore de diretórios inteira será percorrida, o que pode levar algum tempo, portanto, tente manter a hierarquia pequena.
  • Isso não levará em conta os diretórios criados depois que o PATH for definido.
  • Se você chamar 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).
Adam Byrtek
fonte
Dois erros: não está adicionando caminhos absolutos -> não está funcionando corretamente. Além disso, ele adiciona dois pontos duplos. Remover: após $ PATH.
Olli
1

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

ddeimeke
fonte
1

Tente desta maneira:

export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"

Isso se adicionará ~/.local/binjunto com todos os seus subdiretórios em $PATH.

Explicação:

  • du exibirá todas as informações dos subdiretórios de cada linha
  • cut -f2 extrairá a segunda coluna, ou seja, os nomes dos subdiretórios
  • tr '\n' ':'alterará cada quebra de link em dois pontos. Isso unirá todas as linhas em uma única linha e os subdiretórios são delimitados por dois pontos
  • sed 's/:*$//' irá remover o último cólon
R0ckyY2
fonte