.bashrc path problems

1

Alguém pode me dizer como adicionar um diretório, digamos Idl , que contém muitos subdiretórios ao meu IDL_PATH in .bashrc , de modo que, quando eu fizer source .bashrc , poderei conseguir executar todos os executáveis dentro de todos os diferentes subdiretórios?

Isso é possível? Estou fazendo

IDL_PATH=.:+/idl/idl70/lib:/home/cs/Idl .... 

A pasta Idl tem muitos subdiretórios (por exemplo, xidl , idl_code , net etc.). No entanto, só posso executar arquivos na pasta Idl , não nos subdiretórios.

Os arquivos que eu quero executar são procedimentos de IDL com .pro extensões. Se eu colocar meus arquivos .pro em um único diretório, digamos /home/cs/Idl , então todos os meus arquivos pro estão sendo executados.

Existe alguma maneira?

    
por Sapna Mishra 20.03.2016 / 14:50

3 respostas

0

Parece que você terá que adicionar cada diretório que contém um executável separadamente ou vincular todos os executáveis ao mesmo diretório.

  1. Adicione todos os diretórios manualmente.

    Primeiro, colete a lista de diretórios relevantes (suponho que você esteja executando o Linux ou, em qualquer caso, que você tenha ferramentas GNU):

    find /home/cs/Id -type f -executable -exec dirname {} + | sort -u
    

    Os itens acima encontrarão todos os arquivos executáveis em /home/cs/Id e imprimirão o nome do diretório que os contém. O sort -u garante que cada diretório seja impresso apenas uma vez. Eu criei alguns diretórios de teste, então no meu sistema eu recebo:

    $ find /home/terdon/Idl/ -type f -executable -exec dirname {} + | sort -u
    /home/terdon/Idl/foo/bar/bag/ho
    /home/terdon/Idl/foo/bar/bag/ho/fa/fe/re
    /home/terdon/Idl/foo/bar/baz/foo/bar
    /home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz
    

    Agora, você deseja que eles sejam colocados no formato correto para adicionar a $PATH :

    $ find /home/terdon/Idl/ -type f -executable -exec dirname {} + | sort -u | tr '\n' ':'
    /home/terdon/Idl/foo/bar/bag/ho:/home/terdon/Idl/foo/bar/bag/ho/fa/fe/re:/home/terdon/Idl/foo/bar/baz/foo/bar:/home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz:
    

    Copie isso (excluindo o% final:) e adicione-o ao seu PATH :

    PATH="$PATH:/home/terdon/Idl/foo/bar/bag/ho:/home/terdon/Idl/foo/bar/bag/ho/fa/fe/re:/home/terdon/Idl/foo/bar/baz/foo/bar:/home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz"
    
  2. Encontre todos os arquivos executáveis e crie links simbólicos para um diretório já em seu PATH .

    find /home/terdon/Idl/ -type f -executable -exec ln -s {} ~/bin \;
    

    Em alguns sistemas Linux (Ubuntu, por exemplo), o diretório ~/bin é automaticamente adicionado ao seu PATH , se existir. Se isso não acontecer no seu sistema, adicione você mesmo:

    PATH="$PATH:/home/cs/bin"
    
por 20.03.2016 / 15:48
0

Eu acho que é preciso enumerar os diretórios, então. Isso gera a linha para você automaticamente:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Copyright © 2016 Martin Ueding <[email protected]>
# Licensed under the MIT license

import argparse
import os


def main():
    options = _parse_args()

    additions = []

    for base in options.base:
        for dirpath, dirnames, filenames in os.walk(base):
            additions.append(dirpath)

    line = ':'.join(additions)

    if options.short:
        print(line)
    else:
        print('PATH=$PATH:'+line)


def _parse_args():
    parser = argparse.ArgumentParser(description='')
    parser.add_argument('base', nargs='+', help='Basepath')
    parser.add_argument('--short', action='store_true')
    options = parser.parse_args()

    return options


if __name__ == '__main__':
    main()

Salve o snippet como /usr/bin/path-recurse e aplique chmod +x /usr/bin/path-recurse . Então você pode usá-lo no seu prompt para gerar a linha com path-recurse /tmp /foobar … e ele te dará a linha Bash:

PATH=$PATH:/tmp:/tmp/kde-muIusrrC:/tmp/vs0cOIg:/tmp/.esd-1000:/tmp/ssh-oGWOvuUnyqPF:/tmp/.Test-unix:/tmp/.font-unix:/tmp/.XIM-unix:/tmp/.ICE-unix:/tmp/.X11-unix 

Como alternativa, você pode usar o seguinte no seu .bashrc :

PATH=$PATH:$(path-recurve /tmp /foobar …)

Isso irá passar dinamicamente por todas as pastas sempre que o .bashrc for originado.

    
por 20.03.2016 / 15:54
0

Acho que resolvi meu problema. Tudo o que fiz no meu arquivo .bashrc eu escrevi:

PATH = $ {PATH}: $ (localizar ~ / Idl -tipo d | tr '\ n' ':' | sed 's /: $ //')

Então: > fonte .bashrc

Agora posso executar todos os programas e scripts dentro de vários subdiretórios em meu diretório principal do Idl.

Obrigado a todos por suas amáveis atenções.

    
por 20.03.2016 / 18:49

Tags