如何在不遵循符号链接的情况下更改 Rust 中的工作目录?

How to change working directory in Rust without following symlinks?

我有一个这样的符号链接:

$ mkdir -p /tmp/foo/bar
$ ln -s /tmp/foo/bar /tmp/baz

如果我现在使用 std::env::set_current_dir 将工作目录更改为 /tmp/baz,我最终会到达绝对路径 /tmp/foo/bar:

use std::env::{current_dir, set_current_dir};

fn main() {
    set_current_dir("/tmp/baz");
    println!("{:?}", current_dir().unwrap()); // prints "/tmp/foo/bar"
}

是否可以更改工作目录,以便 current_dir returns 逻辑路径 /tmp/baz 而无需解析符号链接?

std::env::set_current_dir 调用 OS 依赖实现。

在 linux 的情况下,这似乎是您感兴趣的,这调用 chdir 其行为由 POSIX 定义,涉及解决符号 link.

根据设计,工作目录不能是 link。这是一个目录。

因为 set_current_dir 只调用 chdir 而没有保留你给它的 link 的踪迹,你给的路径丢失了。如果您想存储符号 link 文件的路径,您必须自己将其存储在您的用户代码中。