繁体   English   中英

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

[英]C++ system() command path with spaces

如果我想在路径中有空格时输入需要路径的命令,如何在 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;
}

这应该不起作用,因为外壳需要在空格前退格。 不幸的是,这也不起作用:

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

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

问问自己:您自己将如何从 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()用于子进程的终止。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM