打开一个 Shell 程序,向其传递参数,然后返回结果

Open a Shell Program, pass it params, and return the results

本文关键字:参数 结果 返回 然后 程序 Shell 一个      更新时间:2023-10-16

我正在用 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"时,你说的是:

  1. 你执行"sudo",给它一个参数"./shell"。

  2. sudo 运行"./shell"(作为根,但这在这里无关紧要)。

  3. "
  4. shell"可执行文件提示输入某种命令,您键入"ls"即可获得输出。

您正在尝试通过以下代码段自动执行它:

popen("sudo ./shell ls ", "r")

这样做是

    执行 "sudo
  1. ",并向 "sudo" 命令传递两个参数:"./shell" 和 "ls"。

这与第一部分的步骤1到3完全不同;这就是为什么它不起作用。

最简单的方法是修改"./shell"以支持将其命令作为参数传递的替代调用方法,而不是让"./shell"交互提示命令执行。

您可以使用

script 命令来捕获输入和输出。之后,您可以比较两种情况的输出(使用 diffcmp并使用简单的程序过滤差异)。