
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 world
funciona, 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);
}