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

29

Parece que ao adicionar um diretório em $ 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?

    
por Tim 31.07.2011 / 01:37

3 respostas

14

Adicione-os recursivamente usando a pesquisa assim:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

AVISO: Como mencionado nos comentários da pergunta, isso não é incentivado, pois representa um risco de 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 guardar

    
por 31.07.2011 / 02:05
16

A estrutura usual de diretório unix tem arquivos de aplicativos classificados em diretórios por tipo: bin para executáveis, lib para bibliotecas, doc para 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 (portanto, 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á demanda para incluir os subdiretórios de um diretório em $PATH .

O que pode ser útil ocasionalmente é incluir todos os subdiretórios bin 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 quando executáveis em diretórios não padrão devem estar em $PATH é criar links simbólicos em um diretório no caminho, como /usr/local/bin . O utilitário stow (ou xstow ) pode ser útil nesse aspecto.

    
por 02.08.2011 / 02:00
3

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 onde os executáveis reais para os programas estão instalados.

Portanto, se o seu $PATH incluir /usr/local/bin (o que é mais provável) 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 no seu $PATH ; os links simbólicos normalmente encontrados nos diretórios bin / type lidam com isso para você.

    
por 20.03.2015 / 19:48

Tags