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

Posted

技术标签:

【中文标题】带空格的 C++ system() 命令路径【英文标题】:C++ system() command path with spaces 【发布时间】:2017-10-07 13:59:02 【问题描述】:

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

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

【问题讨论】:

为什么要用“铃”字\b?您需要使用反斜杠 "a\\ b" 或将路径放入单引号 'a b'。请注意,这两种方法仍然容易受到流氓反斜杠或引号的影响,因此要转义每个坏字符,您需要 Python 中的 pipes.quote 之类的东西 \\` for a single \` 谢谢!有用。我只是误解了\ b。它被写成“退格”,我没有阅读全文。愚蠢的我...daniweb.com/programming/software-development/threads/230885/… 【参考方案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()是子进程的终止。

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

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

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

【讨论】:

以上是关于带空格的 C++ system() 命令路径的主要内容,如果未能解决你的问题,请参考以下文章

Mysql备份还原,cmd命令支持带空格的路径

批处理文件中不能使用带空格的路径,怎么办?

Linux命令行简介

Java程序shell启动脚本文件中路径带空格怎么办?

用start 命令打开带空格的文件用start 命令打开带空格的文件如all user 有啥标准

使用 args 启动进程,其中包含带空格的路径