void exec_pipe_cmd(int cmdc, struct cmd *cmdv)
{
    if (cmdc == 1)
        exec_cmd(&cmdv[0]);

    /* 处理管道中包含 2 个命令的情况 */
    pipe(fd)
    pid = fork();
    if (pid == 0) {
       exec_cmd(cmdv[0])
    }
    exec_cmd(cmdv[1])
}

# 递归实现管道命令

## 3 条命令
a | b | c

## 把 a | b 看做是一个整体 x
x = a | b
a | b | c 化归为 x | c

## 如何表示多条指令

void exec_pipe_cmd(int cmdc, struct cmd *cmdv);

cmdc == 1,表示引用 cmdv 中的 1 条命令,即 a
exec_pipe_cmd(1, cmdv) 执行 a

cmdc == 2,表示引用 cmdv 中的 2 条命令,即 a | b
exec_pipe_cmd(2, cmdv) 执行 a | b

cmdc == 3,表示引用 cmdv 中的 3 条命令,即 a | b | c
exec_pipe_cmd(3, cmdv) 执行 a | b | c

exec_pipe_cmd(cmdc, cmdv) 拆解为
+ exec_pipe_cmd(cmdc - 1, cmdv)  子进程中执行
+ exec_cmd(cmdv[0]) 父进程中执行