Почему мой код Rust не переходит в указанный каталог?

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

SCappella 05.07.2019 08:11
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
826
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь запустить внешнюю команду под названием 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

Другие вопросы по теме