带有空格的C++系统()命令路径
C++ system() command path with spaces
如果我想输入一个需要路径的命令,而我的路径中有空格,我该如何使用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来为您执行。
相关文章:
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 使用QProcess执行命令,并将结果存储在QStringList中
- 数组长度,为什么从命令行获取时不能使用它?
- 从 C++ 中的二进制路径(命令行语句)获取进程 ID
- C 能够以其完整路径打开代码::块中的文件,但不能以相对路径作为命令行参数打开文件
- freopen命令中的路径C
- 带有空格的C++系统()命令路径
- 使用 php 将带有命令行可执行文件路径的参数传递
- 使用相对路径Sublime Text2构建命令
- 如何使用Qt Windows中的设置路径属性从命令行运行应用程序(.exe)时在命令行上打印日志
- 任务管理器如何获取进程的命令行可执行路径
- 通过编译器环境变量或 C 和 C++ 中的命令行标志指定库路径
- 获取cmake可执行路径以在自定义命令上运行它
- 更改系统命令参数的路径