首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C Bash Shell重定向

C Bash Shell重定向
EN

Stack Overflow用户
提问于 2016-09-25 05:14:02
回答 1查看 330关注 0票数 0

我是C语言编程的新手,我正在尝试在我的程序中实现重定向功能。

我已经研究了这段代码一段时间了,我非常希望看到一些新的观点。

如前所述,我正在努力添加bash所具有的重定向特性(例如: pwd > output.txt),代码能够处理大多数基本功能,我已经评论了我是如何将它组合在一起的。

我的问题:

  1. 创建一个使用用户命令进行重定向的函数是否明智呢?我的代码很脏(我希望有任何关于清理的提示)
  2. 我假设我将再次使用strcmp,在一个控件中搜索'<‘,然后在另一个控件中搜索’<‘>,但是我不确定应该将搜索放在哪里(如果我保持在主位置,而不创建一个新函数)。

我现在碰到了一块砖墙,也许是因为我一整天都在做这件事,下面是我的外壳,谢谢大家。

代码语言:javascript
复制
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

/* C based bash shell, working on creating redirects..*/
int main(int argc, char* argv[]){
    char cmnd[1024];  
    char* str1[100];        
    const char* str2 = "exit"; //string to compare for exit
    char* fullpath= "/bin/";//path set to bin
    char progpath[100];//complete file path
    const char* home = getenv("HOME");  //get home enviornment
    char directory[1024];
    char fileD[100];
    char* str3[100];
if(argc == 1)
    {
while(1){

    printf("dollar sign: "); 

    if(!fgets(cmnd, 1024, stdin))
        break;
    size_t length = strlen(cmnd);
    if (cmnd[length - 1] == '\n')
        cmnd[length - 1] = '\0';

     if(strcmp(cmnd, str2)==0){ //check if cmnd is exit
        break;
    }

    char *tkn; //split cmnd into separate strings
    tkn = strtok(cmnd," ");
    int i=0;
    while(tkn!=NULL){//until null is reached, break into tkns
        str1[i]=tkn;      
        tkn = strtok(NULL," ");
        i++;
    }
    str1[i]=NULL;  //last set to Null (EXECVP req)
    strcpy(progpath, fullpath); //copy string /bin/ to file path, for running
    if(strcmp(cmnd, "help")==0)//help line
    {
        printf("Enter bash cmnds, or 'exit' to exit\n");//if help is issued, ignore the rest
    } else if(strcmp(cmnd, "today")==0){//today doesn't exist, but "date" does. Replace today with date.
        strcat(progpath, "date");
    }else{
    strcat(progpath, str1[0]);//add program to path
    }

    for(i=0; i<strlen(progpath); i++){//delete newcmnd
        if(progpath[i]=='\n'){      
            progpath[i]='\0';
        }
    }//start fork
    int pid= fork();

    if(pid==0){//if child
    if(strcmp(str1[0],"cd") == 0)
    {
        int tempCmnd;
        if(!str1[1])
        {

            tempCmnd = chdir(getenv("HOME"));//for moving home
            if(tempCmnd == -1)
            {
                fprintf(stderr, "CD err.\n");
            }else{          
            getcwd(directory, sizeof(directory));
            printf("Currently in %s\n", directory);
            }
        }else{

            tempCmnd = chdir(str1[1]);
            if(tempCmnd == -1)
            {
                fprintf(stderr, "CD err.\n");
            }else{          
                getcwd(directory, sizeof(directory));
                printf("Move Success :  %s\n", directory);//pwd
            }
            }
        break;//(end child proc)
    }else{
        execvp(progpath,str1);
        if(strcmp(cmnd, "help")==0)//ignore the error if help is issued, otherwise standard error
        {
            //printf("Test")
        }
        else{fprintf(stderr, "Child process could not do execvp\n");}
    break;}
    }
    else{//Parent control
        wait(NULL);
    }
    }
}else{

    FILE * pfile;
    pfile = fopen(argv[1], "r" );
    if ( pfile == 0 )
    {
        printf( "Opening file failed\n" );
    }else{
        fgets(fileD, 100, pfile);//fget file into string
        fclose(pfile);//close

        char *tkn; //split pCommand by strtok
        tkn = strtok(fileD," ");
        int i=0;
        while(tkn!=NULL){//until null is reached, break into tkns
        str1[i]=tkn;      
        tkn = strtok(NULL," ");
        i++;
        }
        str1[i]=NULL; //end set to null
        strcpy(progpath, fullpath); //copy full path to program path
        strcat(progpath, str1[0]);//add cmnd to the path
        for(i=0; i<strlen(progpath); i++){// iterate to delete newcmnd
        if(progpath[i]=='\n'){      
            progpath[i]='\0';
        }
      }
        execvp(progpath,str1); //execvp with new string
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-25 05:29:20

是的,将其组合在一起的一种方法是使用strcmp()查找字符<。您可以通过使用strtok()strchr()拆分字符串来获得文件名。然后将文件的内容作为参数传递给命令。

要重定向产出:

打开文件描述符,并使用dup2(fd, 1)写入打开文件描述符。

或者,使用popen()执行命令,并将输出写入文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39683621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档