Combinando dois comandos com um pipe

Estou tentando "mesclar" dois comandos em um comando (inexistente) e canalizá-lo. Com isso eu quero dizer .. Suponha que você tenha esses dois comandos:grep text < file.txt | wc -l > out.txt, o comando (inexistente) que poderia representar esses dois comandos pode ser algo como(grepwc -l < file.txt) que gera o número de linhas no out.txt. Basicamente, este comando (grepwc) deve ter o mesmo comportamento que ogrep text < file.txt | wc -l > out.txt mas mais curto.

Eu tentei algo assim, mas acho que minha abordagem está longe de atingir o objetivo. Eu uso uma estrutura chamada commlist que contém os comandos já analisados por cmd, argc e argv. inputfile e outputfile são os nomes dos caminhos dos arquivos usados em open ().

A estrutura que estou usando.

typedef struct command {
char *cmd;              
int argc;               
char *argv[MAXARGS+1];  
struct command *next;
} COMMAND;

e o código:

void execute(COMMAND *commlist) {
  int fd[2];
  pid_t pid;
  int n_pipes=2; //pipes needed
  COMMAND *aux = commlist;

  int i;
  for(i=0;i<n_pipes; i++){
    int oldfd = 0;

    if(fd[0]!=0){
      close(fd[1]);
      oldfd = fd[0];
    }
      pipe(fd);

      if((pid=fork())<0){perror("Fork Failed");}
      else 
        if(pid == 0){

          if(inputfile!=NULL){
            int in = open(inputfile,O_RDONLY);
            dup2(in,STDIN_FILENO);
            inputfile = NULL;
          }

          if(outputfile != NULL){
            int out = open(outputfile, O_RDWR |O_CREAT | O_TRUNC, S_IRWXU);
            dup2(out,STDOUT_FILENO);
            outputfile = NULL;
          }

          if(oldfd)
            dup2(oldfd,STDIN_FILENO);

          if(commlist->cmd == "grepwc"){
            if(i==0){
              if(execlp("grep","grep","celio",NULL)<0){
                perror("Bad command");
                exit(1);    
              }
            }

            if(i==1){
              if(execlp("wc","wc","-l",NULL) < 0){
                perror("Bad command");
                exit(1);
              }
            }
          }
        }//child
  }
}

O código completo está aqui:

http://pastebin.com/tYGWwUjS

http://pastebin.com/sNJhEg2Y

questionAnswers(1)

yourAnswerToTheQuestion