如果我想在路径中包含空格时输入需要路径的命令,如何在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/";
知道我做错了什么或者我怎么做得更好?感谢。
答案 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来为你做这件事。