Como eu adiciono um programa com um diretório de dependências a $ PATH?

1

Eu quero adicionar um programa ao meu $PATH , mas seu código é dividido em vários arquivos que ele importa em tempo de execução de um lib/ em seu diretório raiz.

projectRootDirectory
├ programBinary
└ lib
  ├ someLibrary
  └ someLibrary2

Como eu adiciono esse programa ao meu $PATH sem reclamar sobre dependências ausentes?

Eu normalmente coloco o binário em /usr/local/bin por

  • copiando

    cp /path/to/programBinary /usr/local/bin
    
  • ou symlinking

    cd /usr/local/bin
    ln -s /path/to/programBinary programBinary
    

mas ambos não conseguem encontrar suas dependências.

Não consigo mover todo o diretório para /usr/local/bin , porque alguns dos arquivos necessários também são executáveis, o que não quero sobrecarregar meu $PATH .

Como devo estar fazendo isso?

    
por Anko 09.03.2015 / 13:36

2 respostas

2

É claro que você pode adicionar projectRootDirectory ao seu $PATH , mas isso tem pelo menos dois inconvenientes:

  • Parece que, da maneira como você está descrevendo, esse projeto em particular não organiza bem o projeto nos subdiretórios bin e lib da seguinte forma:

    projectRootDirectory
    ├ bin
    │ └ programBinary
    └ lib
      ├ someLibrary
      └ someLibrary2
    

    portanto, você seria forçado a colocar projectRootDirectory em $PATH e, como isso contém outras coisas além dos binários destinados à execução, é um pouco feio.

  • Se você tiver muitos projetos semelhantes, o conteúdo do seu $PATH irá proliferar fora de controle.

Em vez disso, a coisa mais simples que você provavelmente pode fazer neste caso em particular é colocar um executável do wrapper em /usr/local/bin , que é um script de shell muito simples que apenas executa o programa "real" do local onde ele vive. / p>

#!/bin/sh
exec projectRootDirectory/programBinary "$@"

Como o script wrapper está chamando-o com seu nome de caminho completo, ele provavelmente conseguirá localizar seus arquivos auxiliares da maneira que normalmente faz.

    
por 09.03.2015 / 13:49
1

Existem muitas formas de complexidade diferente para abordar essa questão, e o que melhor se adequa à sua "filosofia de embalagem".

A abordagem que eu provavelmente escolheria é ter um script de wrapper no diretório /usr/local/bin que não faça nada além de definir a variável exportada PATH , modificada pelo caminho da biblioteca, e chamar o programa principal no caminho da biblioteca; nesse caso, todos os executáveis residiriam no diretório lib, somente o script wrapper inicial em /usr/local/bin . (A variável PATH definida localmente será herdada apenas pelos processos chamados e não afetará o ambiente de chamada.)

    
por 09.03.2015 / 13:49