Como posso definir todos os subdiretórios de um diretório para $ PATH?

38

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?

Tim
fonte
5
Por que diabos você precisa disso?
alex
10
@alex: Por que você acha que não há necessidade?
Tim
4
@ O motivo pelo qual não é "geralmente" suportado é um risco à segurança e geralmente não é necessário. Se você adicionar diretórios recursivamente ao seu caminho, quem sabe o que pode ficar preso lá ... torna muito mais difícil auditar.
Xenoterracide
4
@ Tim: é uma coisa realmente surpreendente e incomum de se querer, é por isso.
alex
8
@alex e os subdiretórios no diretório bin? eu adoraria organizar scripts em diretórios na pasta bin.
Andy

Respostas:

19

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

vschum
fonte
6
Aviso: Esta resposta é tecnicamente correta, mas, como alex e xenoterracide observam, isso é uma coisa louca e insegura, e você definitivamente deve pensar duas vezes antes de realmente usá-la.
Caleb
2
Adicione um aviso à sua resposta sobre por que isso não é uma coisa boa e segura a ser feita na prática.
Caleb
3
Eu não consideraria isso particularmente perigoso ; adicionar diretórios aleatórios a $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).
Gilles 'SO- stop be evil'
3
@ Caleb: louco, talvez, mas por que inseguro? Se alguém tem acesso para adicionar arquivos executáveis maliciosos em subdirs, ele também pode adicioná-los à dir pai (ou seja, ~/binou ~/scripts), pelo que a sua segurança é a mesma.
MestreLion
2
Risco de segurança se você trabalha em um ambiente em que pessoas aleatórias podem adicionar arquivos maliciosos ao seu ~/scripts. Eu não faço e nem deve mais ninguém
oseiskar
21

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.

Gilles 'SO- parar de ser mau'
fonte
4

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ê.

jeffmjack
fonte
1

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.

anon_stackoverflock
fonte