
Manchmal verwende ich Software (für deren Neukompilierung ich weder die Berechtigungen noch die Geduld habe), die zur Laufzeit meinen PATH nach Abhängigkeiten durchsucht, aber diese Abhängigkeiten sind nicht mit dem kompatibel, was ich sonst für meinen PATH haben möchte. Beispielsweise schreibe ich oft Python 3 auf einem Cluster, für den ich manchmal C3-Befehle wie verwenden möchte cexec
, aber C3 möchte, dass das erste Python in meinem PATH Python 2 ist.
Die Angabe des benötigten temporären Pfads wie folgt PATH=/usr/bin cexec echo hello world
funktioniert, ist aber viel zu viel Tipparbeit. Wenn Sie etwas wie
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.
in meiner Shell-Konfiguration ist eine akzeptable Lösung für das Tippproblem, aber dafür muss dasselbe Low-Level-Makro auf alles angewendet werden, was diese Umgebung erfordert. Ich stelle mir vor, dass Befehle auf systematischere Weise dauerhaft mit Umgebungen verknüpft werden könnten, ohne dass es zu Unterbrechungen kommt (solche Makros entpuppen sich manchmal als Hacks, wenn komplizierte Befehle ausgeführt werden) und dass dies keine so schwerfällige Lösung ist wie ein Container/eine virtuelle Maschine. Gibt es eine Standardlösung für dieses Problem?
Antwort1
Erstellen Sie einen Sh-Wrapper (vorzugsweise Dash) um die ausführbare Datei, in der Sie die Umgebung einrichten, und führen Sie dann das Ziel aus:
#!/bin/sh
ENVVAR=envvar exec ./target "$@"
Dash ist recht effizient und verlängert die Startzeit des Ziels auf meinem Computer nur um etwa 0,0005 Sekunden.
Der entsprechende C-Wrapper wird nicht viel schneller sein:
#include <unistd.h>
int main(int argc, char *argv[])
{
setenv("ENVVAR", "envvar", 1);
execvp("./target", argv);
}