带空格的 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() 命令路径的主要内容,如果未能解决你的问题,请参考以下文章