我的目标是让用户查看已输入命令的历史记录(historyArray
- 已完成)并允许他重新运行历史记录中的任何命令,方法是输入history 1
,history 2
其中1
和2
是从historyArray
打印出来的命令列表编号。
我已设法从用户输入的第二个参数(history 1
)获取索引。我现在的问题是,如何执行从history N
获得的特定命令?
所以,例如:
hshell> test [Enter]
Command not found
hshell> history 1
Command not found
这是我的进步:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
int i=0; int j=0; int k=0;
int elementCounter = 0;
char inputString[100];
char *result=NULL;
char delims[] = " ";
char historyArray[30][20] = {0};
char tokenArray[20][20] ;
int tempIndex = 0;
char hCommand[2][20]={0};
do
{
j = 0;
printf("hshell>");
gets(inputString);
strcpy (historyArray[k], inputString);
k = (k+1) % 20;
if (elementCounter <= 20)
{
elementCounter++;
}
if (elementCounter == 21)
{
k = 20;
for (i=0; i<20; i++)
{
strcpy(historyArray[i], historyArray[i+1]);
}
strcpy (historyArray[19], inputString);
}
// Break the string into parts
result = strtok(inputString, delims);
while (result!=NULL)
{
strcpy(tokenArray[j], result);
j++;
result= strtok(NULL, delims);
}
if (strcmp(tokenArray[0], "exit") == 0)
{
return 0;
}
else if (strcmp(tokenArray[0], "history") == 0)
{
if (j>1)
{
tempIndex = atoi(tokenArray[1]);
strcpy(hCommand,historyArray[tempIndex-1]);
puts(hCommand);
// tempIndex = atoi(tokenArray[j]);
//puts(tempIndex);
}
else
{
//print history array
for (i=0; i<elementCounter-1;i++)
printf("%i. %s\n", i+1, historyArray[i]);
}
}
else
{
printf("Command not found\n");
}
}while (1);
}
hCommand
是我存储从historyArray
获得的命令的地方。答案 0 :(得分:1)
获取要执行的命令的名称后,我建议通过系统调用exec。考虑到 exec 将当前过程映像替换为您要执行的过程映像。否则您可能对fork感兴趣。
编辑#1 然后我相信你需要this API。请注意,我不熟悉哪些功能与我首先提供的功能相同。有点时间你可以搞清楚,对吧? :)
答案 1 :(得分:0)
您可以在stdlib.h中使用'system'功能。
#include <stdlib.h>
int system(const char *command);
此功能包含在windows和* nix中。您无需担心单独调用fork
或CreateProcess
,这将为您解决此问题。有关详细信息,请参阅MSDN documentation。
在你的代码中,你会写:
system(hCommand);
命令完成后将返回(它是同步调用)。