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: