在 C++ 中使用 system();不起作用

using system() in C++;does not work

我需要在我的 C++ 代码中执行这个命令: mkdir -p sample_directory/{1..10} 制作10个目录。但是当我在代码的系统函数中使用它时:

system("mkdir -p sample_director/{1..10}");

执行后只创建一个目录,名称为:{1..10} 我该如何解决?

您或许可以尝试使用循环结构来做同样的事情。

# include <cstdlib>
# include <string>

using namespace std;

int main(){
    for(int i=1;i<=10;i++){
        string str="mkdir -p sample_director/" + to_string(i);  
        system(str.c_str());
    }
    return 0;
}

并且 运行 您的代码 c++11 支持

$ g++ -std=c++11 my_program.cpp

它不起作用,因为 dash 不支持大括号扩展(类似于 {1..10} 的语法)。 system 函数不关心 SHELL 的值,它总是将提供的参数传递给 /bin/sh。而在 Ubuntu 上 /bin/sh 指的是 dash,它无法处理大括号扩展。在其他一些发行版(如 Arch)上,/bin/shbash 的符号链接,因此您的代码可以正常工作。

如果我是你,在这种情况下我根本不会使用 systemBoost::filesystem(甚至 mkdir/mkdirat)对我来说似乎是更好的选择。

大括号扩展不在 POSIX 中,因此并非所有 shell 都实现它。特别是,在 POSIX 中,system 应该调用 sh,它应该像 "plain" POSIX shell 而不是 bash 或其他一些功能丰富的 shell。所以它不会进行大括号扩展。

如果您希望bash处理命令,您可以直接调用bash...

system("bash -c 'mkdir -p sample_director/{1..10}'");

或者您可以单独进行 10 次 system 调用。或者其他解决方法,我相信你能想到一些。