【发布时间】:2015-04-12 21:16:06
【问题描述】:
我正在用 c++ 编写一个 shell 脚本,我正在尝试编写一种方法来通过比较系统运行时生成的输出和我的 shell diff-wise 来进行一些基本的单元测试。
根据阅读大量 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 ls不同。也许您想将字符串ls写入子进程的STDIN? -
您可能应该使用
sudo运行您的程序并在不添加前缀的情况下调用脚本,但这取决于您在做什么。