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» в конце пути, а затем в main() я помещаю функцию inner_main() в let и затем повторно объявите let как строку, чтобы я мог перейти в каталог.
Всякий раз, когда он пытается перейти в каталог nvs, ничего не происходит, и я знаю, что команда запускается, потому что, если я перемещаю двоичный файл куда-то без файла nvs в том же каталоге, он запускается, говоря, что не может найти этот каталог, поэтому мой вопрос, когда он находится в каталог с nvs, почему он на самом деле не переходит в указанный каталог, как должен?

Вы пытаетесь запустить внешнюю команду под названием 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
См. этот вопрос (связанные вопросы также очень актуальны). Короткая версия заключается в том, что
cdне работает так, потому что это не исполняемый файл: это встроенная оболочка. Если вы хотите изменить рабочий каталог, проверьтеstd::env::set_current_dir.