Parece que, ao adicionar um diretório ao $ PATH, seus subdiretórios não são adicionados recursivamente. Então eu posso fazer isso? Ou existe uma razão pela qual isso não é suportado?
Parece que, ao adicionar um diretório ao $ PATH, seus subdiretórios não são adicionados recursivamente. Então eu posso fazer isso? Ou existe uma razão pela qual isso não é suportado?
Respostas:
Adicione-os recursivamente usando find da seguinte forma:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
AVISO: Conforme mencionado nos comentários da pergunta, isso não é recomendado, pois representa um risco à segurança, pois não há garantia de que os arquivos executáveis nos diretórios adicionados não sejam maliciosos.
Provavelmente é uma solução melhor seguir a resposta de Gilles e usar o stow
$PATHé perigoso, mas adicionar subdiretórios não é notavelmente pior. Mas geralmente é inútil e possivelmente ineficiente (e pode até colocar você nos limites de tamanho do ambiente às vezes).
~/binou ~/scripts), pelo que a sua segurança é a mesma.
~/scripts. Eu não faço e nem deve mais ninguém
A estrutura de diretórios unix usual possui arquivos de aplicativos classificados em diretórios por tipo: binpara executáveis, libbibliotecas, docdocumentação e assim por diante. É quando eles são instalados em diretórios separados; muitas vezes, os aplicativos são agrupados em alguns diretórios (daí muitos sistemas têm apenas três diretórios em $PATH: /usr/local/bin, /usr/bine /bin). É raro ter arquivos executáveis e subdiretórios dentro de um diretório, portanto não há necessidade de incluir subdiretórios de um diretório $PATH.
O que ocasionalmente pode ser útil é incluir todos os binsubdiretórios de subdiretórios de um determinado diretório em $PATH:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
No entanto, isso raramente é feito. O método usual para a execução de executáveis em diretórios não-padrão $PATHé criar links simbólicos em um diretório no caminho, como /usr/local/bin. O stowutilitário (ou xstow) pode ser útil nesse sentido.
Uma razão pela qual isso não é suportado é porque os diretórios bin / (e similares) usam links simbólicos para apontar para os diretórios específicos em que os executáveis reais dos programas estão instalados.
Portanto, se você $PATHincluir /usr/local/bin(o que provavelmente faz) essa pasta está cheia de links simbólicos (como ruby) que apontam para o diretório específico onde o código para executar o ruby é encontrado (como ../Cellar/ruby/2.1.3/bin/ruby).
É por isso que você não precisa especificar a pasta de cada executável na sua $PATH; os links simbólicos normalmente encontrados nos diretórios bin / type tratam disso para você.
No zsh , $ PATH pode ser anexado como uma matriz. Você pode usar globbing de shell para adicionar vários subdiretórios à matriz $ PATH.
Exemplo:
Em .zshrc:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
Isso anexará todos os subdiretórios de $ BINPATH à matriz $ PATH.