带有空格的C ++ system()命令路径

时间:2017-10-07 13:59:02

标签: c++ string function system

如果我想在路径中包含空格时输入需要路径的命令,如何在c ++中使用system()函数? 示例代码:

#include <iostream>

int main()
{
    std::string command = "ls -la /home/testuser/this is a folder/test/";
    std::cout << "Click enter to execute command..." << std::endl;
    getchar();
    std::system(command.c_str());
    return 0;
}

这并不是因为shell需要在空间前面的退格。 不幸的是,这也不起作用:

std::string command = "ls -la /home/testuser/this\b is\b a\b folder/test/";

知道我做错了什么或者我怎么做得更好?感谢。

1 个答案:

答案 0 :(得分:1)

问问自己:你将如何从shell提示符中执行此命令?

$ ls -la /home/testuser/this is a folder/test/

当然,这不会因程序失败的原因而起作用。相反,正如shell脚本的每个入门教你一样,你需要引用参数:

$ ls -la "/home/testuser/this is a folder/test/"

这将有效,您以完全相同的方式使用system()

std::string command = "ls -la \"/home/testuser/this is a folder/test/\"";

但更好的是,首先不使用system()。出于所有实际目的,所有system()都是fork(),后面是子进程中的exec(),父进程wait()用于子进程&#39}终止。

问题是子进程exec()系统shell,它根据规则解析命令。这包括直接通过shell执行命令时发生的所有正常事情:文件名扩展,通配和其他事情。

如果传递给exec()的字符串包含任何特殊的shell字符,它们将被shell解释。在这种情况下,您有意使用它来正确解析命令字符串,以便将正确的参数传递给/bin/ls

执行特定的固定命令时,这很好。但是当实际命令变化或包含外部指定的参数时,您有责任正确处理任何shell通配符以获得预期结果。否则,Hillarity会随之而来。在这种情况下,您会发现自己使用fork()exec()将产生更加确定且可靠的结果,您可以完全控制传递给正在执行的命令的所有参数,而不是依靠系统shell来为你做这件事。