打开一个 Shell 程序,向其传递参数,然后返回结果
Open a Shell Program, pass it params, and return the results
我正在用 c++ 编写一个 shell 脚本,我正在尝试编写一种方法,通过比较系统运行时生成的输出和我的 shell diff 来进行一些基本的单元测试。
基于阅读大量 StackOverflow 文章,这就是我用来捕获简单 ls 命令输出的方法:
FILE *syst;
char buff[512];
string systout ( "" );
if(!(syst = popen("ls ", "r"))){
cout << "Failed! " << endl;
return 1;
}
while(fgets(buff, sizeof(buff), syst)!=NULL){
systout.append(buff);
}
fflush(syst);
pclose(syst);
这工作得很好。
问题是我找不到一种方法来让它适用于我的 shell 脚本。通常我使用 sudo ./shell
运行它,然后ls
.
这就是我现在拥有的,但它不起作用。我认为它没有找到我的外壳或其他东西,但没有任何输出。我知道 shell 有效,因为我手动运行了它,并且结果与预期结果相匹配。
FILE *shel;
char buff2[512];
string shelout ( "" );
if(!(shel = popen("sudo ./shell ls ", "r"))){
cout << "Failed! " << endl;
return 1;
}
while(fgets(buff2, sizeof(buff2), shel)!=NULL){
shelout.append(buff2);
}
fflush(shel);
pclose(shel);
有什么想法吗?
当你说"通常我使用sudo ./shell运行它,然后是ls"时,你说的是:
-
你执行"sudo",给它一个参数"./shell"。
-
sudo 运行"./shell"(作为根,但这在这里无关紧要)。
" shell"可执行文件提示输入某种命令,您键入"ls"即可获得输出。
您正在尝试通过以下代码段自动执行它:
popen("sudo ./shell ls ", "r")
这样做是
- 执行 "sudo
- ",并向 "sudo" 命令传递两个参数:"./shell" 和 "ls"。
这与第一部分的步骤1到3完全不同;这就是为什么它不起作用。
最简单的方法是修改"./shell"以支持将其命令作为参数传递的替代调用方法,而不是让"./shell"交互提示命令执行。
您可以使用
script
命令来捕获输入和输出。之后,您可以比较两种情况的输出(使用 diff
或 cmp
并使用简单的程序过滤差异)。
相关文章:
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 执行参数未提供预期结果
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- C++:通过函数参数传递的值给出不同的结果
- 结果失败或多个参数无效
- 使用函数结果作为参数的 C++
- 添加可变参数函数的错误结果
- 从可调用可变参数元组中的函数结果创建元组
- (WMI)ExecMethod out 参数 - 无论调用的结果如何,ResultingSnapshot 都是 NULL
- C++:术语的计算结果不是采用 1 个参数的函数
- 在线程错误 C2064 中:term 的计算结果不为 0 个参数的函数
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 提升线程:术语的计算结果不为 0 个参数
- 当类的对象更改其参数时,如何获得结果
- 是否可以使用自动占位符来推断非类型模板参数中的函数结果
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 使用 constexpr 函数的结果作为模板参数(clang vs gcc)
- 在 c++ 代码中具有相同的函数和参数的不同结果
- 默认模板参数结果为"expected type-specifier"