
Às vezes me pego usando um software (que não tenho permissão ou paciência para recompilar) que pesquisa meu PATH procurando suas dependências em tempo de execução, mas essas dependências não são compatíveis com o que eu gostaria que meu PATH fosse. Por exemplo, muitas vezes escrevo python 3 em um cluster que às vezes quero usar comandos c3 como cexec
, mas c3 deseja que o primeiro python em meu PATH seja python 2.
Especificar o PATH temporário necessário como este, PATH=/usr/bin cexec echo hello world
funciona, mas é muita digitação. 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 configuração do meu shell é uma boa solução para o problema de digitação, mas isso requer a aplicação da mesma macro de baixo nível a tudo que requer esse ambiente. Imagino que os comandos possam ser persistentemente associados a ambientes de uma forma mais sistemática que não seja quebrada (essas macros às vezes mostram que são hacks ao executar comandos complicados) e que não seja uma solução tão pesada quanto um contêiner/máquina virtual. Existe uma solução padrão para este problema?
Responder1
Crie um wrapper sh (de preferência traço) em torno do executável onde você configura o ambiente e, em seguida, execute o destino:
#!/bin/sh
ENVVAR=envvar exec ./target "$@"
Dash é bastante eficiente e isso adiciona apenas cerca de 0,0005s ao tempo de inicialização do alvo na minha máquina.
O wrapper C equivalente não será muito mais rápido que isso:
#include <unistd.h>
int main(int argc, char *argv[])
{
setenv("ENVVAR", "envvar", 1);
execvp("./target", argv);
}