为什么我的 Rust 代码没有进入上述目录?
Why isn't my Rust code cding into the said directory?
use std::{
env, io,
path::PathBuf,
process::{self, Command},
};
fn inner_main() -> io::Result<PathBuf> {
let exe = env::current_exe()?;
let dir = exe.parent().expect("Executable must be in some directory");
let dir = dir.join("nvs");
Ok(dir)
}
fn main() {
let path = inner_main().expect("Couldn't get path.");
let path = path.into_os_string().into_string().unwrap();
Command::new("cd")
.arg(&path)
.status()
.expect("Something went wrong.");
process::exit(0);
}
我获取二进制文件所在的路径,进入父目录,使二进制文件名称不再在路径中,然后在路径末尾附加 "nvs",然后在 [=11] =] 我将 inner_main()
函数放在一个 let 中,然后将 let 重新声明为一个字符串,这样我就可以 cd 进入目录。
每当它尝试 CDing 进入 nvs 目录时,什么也没有发生,我知道该命令会运行,因为如果我将二进制文件移动到同一目录中没有 nvs 文件的某个地方,它会运行说找不到该目录所以我的问题当它位于带有 nvs 的目录中时,为什么它实际上没有像它应该的那样 cd 进入所述目录?
您正在尝试 运行 一个名为 cd
的外部命令。根据您的操作系统,这可能会失败,因为没有名为 cd
的命令,或者除了测试该目录是否存在以及您是否有权访问它之外什么都不做。如果 cd
命令存在,它 运行 在您程序的子进程中,并且其目录更改不会影响您的进程。
要切换到不同的目录,您需要更改您自己的进程的工作目录。调用 std::env::set_current_dir
.
std::env::set_current_dir(&path).expect("Unable to change into [path to executable]/nvs");
// do stuff in …/nvs
use std::{
env, io,
path::PathBuf,
process::{self, Command},
};
fn inner_main() -> io::Result<PathBuf> {
let exe = env::current_exe()?;
let dir = exe.parent().expect("Executable must be in some directory");
let dir = dir.join("nvs");
Ok(dir)
}
fn main() {
let path = inner_main().expect("Couldn't get path.");
let path = path.into_os_string().into_string().unwrap();
Command::new("cd")
.arg(&path)
.status()
.expect("Something went wrong.");
process::exit(0);
}
我获取二进制文件所在的路径,进入父目录,使二进制文件名称不再在路径中,然后在路径末尾附加 "nvs",然后在 [=11] =] 我将 inner_main()
函数放在一个 let 中,然后将 let 重新声明为一个字符串,这样我就可以 cd 进入目录。
每当它尝试 CDing 进入 nvs 目录时,什么也没有发生,我知道该命令会运行,因为如果我将二进制文件移动到同一目录中没有 nvs 文件的某个地方,它会运行说找不到该目录所以我的问题当它位于带有 nvs 的目录中时,为什么它实际上没有像它应该的那样 cd 进入所述目录?
您正在尝试 运行 一个名为 cd
的外部命令。根据您的操作系统,这可能会失败,因为没有名为 cd
的命令,或者除了测试该目录是否存在以及您是否有权访问它之外什么都不做。如果 cd
命令存在,它 运行 在您程序的子进程中,并且其目录更改不会影响您的进程。
要切换到不同的目录,您需要更改您自己的进程的工作目录。调用 std::env::set_current_dir
.
std::env::set_current_dir(&path).expect("Unable to change into [path to executable]/nvs");
// do stuff in …/nvs