0
我想在c中編寫一個簡單的shell,我開始通過從網上抓取一些代碼來進行簡單解析,但是我遇到了一個問題,當我嘗試用args執行命令時,例如ls -l它會忽略這個參數,system()沒有考慮這些參數嗎?代碼如下系統調用的參數
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DELIMS " \t\r\n"
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *cmd;
char line[1024];
printf("Starting Omar's Shell\n");
while (1) {
printf("What can i do for you?>");
if (!fgets(line, 1024, stdin)) break;
// Parse and execute command
if (cmd = strtok(line, DELIMS)) {
// Clear errors
errno = 0;
if (strcmp(cmd, "exit") == 0) {
break;
} else {
if(system(line) !=0){
printf("An error has occured\n");
}
}
if (errno) perror("Command failed");
}
}
return 0;
}
'strtok'破壞原始行。這就是它的工作原理,它會插入''\ 0'',以便您可以遍歷令牌。要麼使用不同的方法,要麼在使用strtok之前複製字符串。 – keltar 2015-02-08 05:59:32
我試過@CoolGuy,但它似乎沒有工作,所以相反,我在我調用strtok()之前複製了字符串,而是用副本執行了命令。有沒有其他方法可以解決這個問題? – Stiddi 2015-02-08 06:16:45
總有其他的方法。你可以實現非破壞性的strtok替代方法,它會將單詞複製到單獨的緩衝區而不是破壞原始文件。或者,如果您的shell旨在或多或少地進步,那麼實施詞法分析器並處理其中的令牌提取可能是一個好主意。 – keltar 2015-02-08 06:25:24