如果我想输入一个需要路径的命令,而我的路径中有空格,我该如何使用 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/