¿Forma recomendada de asociar el comando con el medio ambiente?

¿Forma recomendada de asociar el comando con el medio ambiente?

A veces me encuentro usando software (que no tengo los permisos ni la paciencia para volver a compilar) que busca en mi RUTA sus dependencias en tiempo de ejecución, pero estas dependencias no son compatibles con lo que de otro modo quiero que sea mi RUTA. Por ejemplo, a menudo escribo Python 3 en un clúster en el que a veces quiero usar comandos de C3 como cexec, pero C3 quiere que el primer Python en mi RUTA sea Python 2.

Especificar la RUTA temporal necesaria de esta manera PATH=/usr/bin cexec echo hello worldfunciona, pero es demasiado escribir. Poniendo 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.

en mi configuración de shell es una buena solución al problema de escritura, pero esto requiere aplicar la misma macro de bajo nivel a todo lo que requiera ese entorno. Me imagino que los comandos podrían asociarse persistentemente con entornos de una manera más sistemática que no se rompa (tales macros a veces muestran que son trucos al ejecutar comandos complicados) y que no es una solución tan pesada como un contenedor/máquina virtual. ¿Existe una solución estándar para este problema?

Respuesta1

Cree un contenedor sh (preferiblemente guión) alrededor del ejecutable donde configura el entorno y luego ejecuta el objetivo:

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

Dash es bastante eficiente y esto solo agrega alrededor de 0,0005 segundos al tiempo de inicio del objetivo en mi máquina.

El contenedor C equivalente no será mucho más rápido que eso:

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

información relacionada