Obwohl die symbolischen Links vom Kernel aufgelöst werden, könnten Sie immer noch einen LD_PRELOAD-Trick anwenden, indem Sie alle libc-Funktionen umschließen, die Pfadnamen annehmen und alle $XYZ-Komponenten in der von 'readlink' zurückgegebenen Zeichenfolge erweitern (Parametererweiterung). Führen Sie dann den erweiterten Pfad der Wrapped-Funktion zu. Sie müssen den Zielpfad von der Shell-Erweiterung beim Erstellen des Links maskieren, wie jaztik vorschlägt.
Da die injizierte Bibliothek vollen Zugriff auf die Benutzerumgebung hat, wird dies alle Erwartungen des OP erfüllen.
Jawohl. Kein Problem. Tatsächlich werden Sie die $HOME-Variable in Ihrem Link nicht verwenden, sodass sie beispielsweise nicht mit intelligenten Lösungen für Benutzergruppen funktioniert. Die Variable wird beim Ausführen des Befehls von der Shell übersetzt und der Inhalt der Variable im Link verwendet.
ln -s ~/test /tmp/test
wird zu
erweitert/<path>/<to>/home/test -> /tmp/test
Ah. und nur die Umgebungsvariablen der Person, die ln aufruft, funktionieren. Sie können keine Umgebungsvariablen anderer Personen im Link speichern. Die Variablen werden vor Aufruf des Befehls expandiert.
Wenn Sie die Variable im Link nicht erweitern möchten, können Sie sie in einfache Anführungszeichen setzen,
ln -s '$HOME/file/or/folder' newname
Dies würde ergeben,
newname -> $HOME/file/or/folder
anstatt es auf Ihr lokal gesetztes $HOME erweitern zu lassen. Wie in anderen Antworten beschrieben, wird es überhaupt nicht erweitert. So können Sie z. Verwenden Sie es, um auf eine Datei innerhalb des Literals $HOME
zu verlinken Ordner.
[Beachten Sie, dass dies systemabhängig ist - nicht alle Systeme unterstützen unterschiedliche Symlinks]
Symbolische Links werden vom Kernel gehandhabt, und der Kernel kümmert sich nicht um Umgebungsvariablen. Also nein.