带有空格的C++系统()命令路径

C++ system() command path with spaces

本文关键字:命令 路径 系统 C++ 空格      更新时间:2023-10-16

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

据推测,这是不起作用的,因为外壳需要在空间前面后退。不幸的是,这也不起作用:

std::string command = "ls -la /home/testuser/thisb isb ab 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执行命令时发生的所有正常事情:文件名扩展、globbing和其他事情。

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

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