Maneira recomendada de associar comando com ambiente?

2

Por vezes, encontro-me a utilizar software (que não tenho permissão nem paciência para recompilar) que procura através do meu PATH procurando as suas dependências em tempo de execução, mas estas dependências não são compatíveis com o que de outra forma gostaria ser estar. Por exemplo, eu geralmente escrevo python 3 em um cluster que às vezes quero usar comandos c3 como cexec , mas c3 quer que o primeiro python no meu PATH seja python 2.

Especificar o PATH temporário necessário como este, PATH=/usr/bin cexec echo hello world , funciona, mas é digitação em excesso. Colocando algo como

C3PREFIX=/usr/bin
alias cexec=$C3PREFIX cexec
alias cname=$C3PREFIX cget
alias cname=$C3PREFIX cpush
alias cname=$C3PREFIX cnames
... for all such commands needing a special environment.

na minha configuração do shell é uma solução bem para o problema de digitação, mas isso requer a aplicação da mesma macro de baixo nível para tudo que requer esse ambiente. Eu imagino que os comandos podem ser persistentemente associados a ambientes de uma maneira mais sistemática que não irá quebrar (tais macros às vezes mostram que são hacks quando executam comandos complicados) e que não é tão pesado quanto uma solução como um contêiner / máquina virtual. Existe uma solução padrão para este problema?

    
por seewalker 03.11.2016 / 21:44

1 resposta

2

Crie um wrapper sh (preferencialmente traço) em torno do executável no qual você configura o ambiente e, em seguida, execute o destino:

#!/bin/sh
ENVVAR=envvar exec ./target "$@"

O Dash é bastante eficiente, e isso só adiciona cerca de 0,0005s ao tempo de inicialização do destino na minha máquina.

O wrapper C equivalente não será muito mais rápido do que isso:

#include <unistd.h>
int main(int argc, char *argv[])
{
       setenv("ENVVAR", "envvar", 1);
       execvp("./target", argv);
}
    
por 03.11.2016 / 21:59