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

标签 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/";

知道我做错了什么或者我如何才能做得更好吗?谢谢。

最佳答案

问问自己:您自己如何从 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,它根据它的规则解析命令。这包括直接通过 shell 执行命令时发生的所有正常事情:文件名扩展、通配和其他事情。

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

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

关于带空格的 C++ system() 命令路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53875552/

相关文章:

java - 需要帮助使用 String Tokenizer 来计算字符串中单词的频率

c# - C# 中错误的字符串排序

javascript - javascript 中 2 个数字相加不正确

在 Cakephp 中上传图片

c - 我不断收到错误消息 : "Conflicting types for ' sqrt' "

C++传递一个对象

c++ - 对相邻的数组元素使用共享内存?

与一或零不匹配的字符串模式匹配

c++ - Visual C++ 2008 问题

C++ 创建具有不同字段组合的类的变体