シンボリック リンクはカーネルによって解決されますが、LD_PRELOAD トリックを実行して、パス名を受け取るすべての libc 関数をラップし、'readlink' (パラメーター展開) によって返される文字列内の $XYZ コンポーネントを展開することができます。次に、展開されたパスをラップされた関数にフィードします。 jaztik が提案するように、リンクを作成するときにシェル展開からターゲット パスをエスケープする必要があります。
注入されたライブラリはユーザーの環境に完全にアクセスできるため、これは OP のすべての期待を満たします。
はい。問題なし。実際には、実際にはリンクで $HOME 変数を使用するわけではないため、たとえばユーザー グループのスマート ソリューションでは機能しません。変数はコマンドの実行時にシェルによって変換され、変数の内容がリンクで使用されます。
ln -s ~/test /tmp/test
に展開されます
/<path>/<to>/home/test -> /tmp/test
ああ。 ln を呼び出している人の環境変数のみが機能します。リンクに他の人の環境変数を保存することはできません。変数は、コマンドを呼び出す前に展開されます。
リンク内の変数を展開したくない場合は、一重引用符で囲みます。
ln -s '$HOME/file/or/folder' newname
これにより、
newname -> $HOME/file/or/folder
ローカルに設定された $HOME に展開するのではなく。他の回答で説明されているように、まったく展開されません。だから、例えばすることができます。それを使用して、リテラル $HOME
内のファイルにシンボリック リンクします。
[これはシステムに依存することに注意してください - すべてのシステムがバリアント シンボリック リンクをサポートしているわけではありません]
シンボリック リンクはカーネルによって処理され、カーネルは環境変数を気にしません。だから、いいえ。