如何在不遵循符号链接的情况下更改 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 文件的路径,您必须自己将其存储在您的用户代码中。
我有一个这样的符号链接:
$ 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 文件的路径,您必须自己将其存储在您的用户代码中。