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?
@ 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
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.
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ê.
Respostas:
Adicione-os recursivamente usando find da seguinte forma:
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
fonte
$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émA 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
: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
. Ostow
utilitário (ouxstow
) pode ser útil nesse sentido.fonte
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 (comoruby
) 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ê.fonte
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
:Isso anexará todos os subdiretórios de $ BINPATH à matriz $ PATH.
fonte