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).
~/bin
ou ~/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: bin
para executáveis, lib
bibliotecas, doc
documentaçã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/bin
e /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 bin
subdiretó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 stow
utilitá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ê $PATH
incluir /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.