我有一个在C中创建Linux shell的任务.目前,我仍然坚持实现重定向和管道.我到目前为止的代码如下.main()解析用户的输入.如果内置命令,则执行该命令.否则,标记化的输入传递给execute()(我知道我应该把内置命令拉到自己的函数中).

execute()的作用是遍历数组.如果遇到或者|它应该采取适当的行动.我试图正常工作的第一件事是管道.不过,我肯定做错了,因为即使是一个烟斗也无法让它工作.例如,一个示例输入/输出:

/home/ad/Documents> ls -l | grep sh

|: sh: No such file or directory

|

我的想法是让每个方向和管道仅适用于一个案例,然后通过使函数递归,我希望在同一命令行中使用多个重定向/管道.例如,我可以做program1 < input1.txt > output1.txt或ls -l | grep sh > output2.txt.

我希望有人可以在尝试管道时指出我的错误,并且可能提供一些关于如何处理用户输入多个重定向/管道的情况的指示.

#include

#include

#include

#include

#include

int MAX_PATH_LENGTH = 1024; //Maximum path length to display.

int BUF_LENGTH = 1024; // Length of buffer to store user input

char * delims = " \n"; // Delimiters for tokenizing user input.

const int PIPE_READ = 0;

const int PIPE_WRITE = 1;

void execute(char **argArray){

char **pA = argArray;

int i = 0;

while(*pA != NULL) {

if(strcmp(argArray[i],"

printf("

}

else if(strcmp(argArray[i],">") == 0) {

printf(">\n");

}

else if(strcmp(argArray[i],"|") == 0) {

int fds[2];

pipe(fds);

pid_t pid;

if((pid = fork()) == 0) {

dup2(fds[PIPE_WRITE], 1);

close(fds[PIPE_READ]);

close(fds[PIPE_WRITE]);

char** argList;

memcpy(argList, argArray, i);

execvp(argArray[0], argArray);

}

if((pid = fork()) == 0) {

dup2(fds[PIPE_READ], 0);

close(fds[PIPE_READ]);

close(fds[PIPE_WRITE]);

execvp(argArray[i+1], pA);

}

close(fds[PIPE_READ]);

close(fds[PIPE_WRITE]);

wait(NULL);

wait(NULL);

printf("|\n");

}

else {

if(pid == 0){

execvp(argArray[0], argArray);

printf("Command not found.\n");

}

else

wait(NULL);*/

}

*pA++;

i++;

}

}

int main () {

char path[MAX_PATH_LENGTH];

char buf[BUF_LENGTH];

char* strArray[BUF_LENGTH];

/**

* "Welcome" message. When mash is executed, the current working directory

* is displayed followed by >. For example, if user is in /usr/lib/, then

* mash will display :

* /usr/lib/>

**/

getcwd(path, MAX_PATH_LENGTH);

printf("%s> ", path);

fflush(stdout);

/**

* Loop infinitely while waiting for input from user.

* Parse input and display "welcome" message again.

**/

while(1) {

fgets(buf, BUF_LENGTH, stdin);

char *tokenPtr = NULL;

int i = 0;

tokenPtr = strtok(buf, delims);

if(strcmp(tokenPtr, "exit") == 0){

exit(0);

}

else if(strcmp(tokenPtr, "cd") == 0){

tokenPtr = strtok(NULL, delims);

if(chdir(tokenPtr) != 0){

printf("Path not found.\n");

}

getcwd(path, MAX_PATH_LENGTH);

}

else if(strcmp(tokenPtr, "pwd") == 0){

printf("%s\n", path);

}

else {

while(tokenPtr != NULL) {

strArray[i++] = tokenPtr;

tokenPtr = strtok(NULL, delims);

}

execute(strArray);

}

bzero(strArray, sizeof(strArray)); // clears array

printf("%s> ", path);

fflush(stdout);

}

}

linux脚本实现多重管道,制作Linux shell时流重定向和管道相关推荐

  1. linux脚本怎么获取参数,在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?...

    Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多.如:[ip]命令可以配置IP地址.路由条目的配置管理操作非常完善,该命令就可以完成[ifconfig]和[route]命令实现 ...

  2. jsp运行linux脚本,jsp页面调用哪个Linux的shell 脚本步骤

    当前位置:我的异常网» Linux/Unix » jsp页面调用哪个Linux的shell 脚本步骤 jsp页面调用哪个Linux的shell 脚本步骤 www.myexceptions.net  网 ...

  3. linux脚本用户输入,如何在Linux shell脚本中提示用户输入

    本篇文章给大家介绍关于如何在Linux shell脚本中提示用户输入?下面来看具体的内容. 我们首先来看一下命令# read var # read -s "Waiting for input ...

  4. linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本

    我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...

  5. linux 脚本$字符,一文看懂shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义

    概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 今天主要介绍一下 ...

  6. linux脚本运行java程序设计_Java运行Shell脚本

    利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序.参考了互联网上的这篇文章,我重新整理了代码. 现在通过CommandHelper.ex ...

  7. linux脚本语言求累加和,Linux Shell脚本语言与数学表达式

    当你理解了Shell脚本,每当需要时都能流畅编写时,那种感觉很爽的.本章中,我们将教你用脚本语言进行比较复杂的数学运算. 让我们从斐波那契数列开始吧. 斐波那契数列,又称黄金分割数列,指的是这样一个数 ...

  8. linux脚本登录启动失败,在Linux上检查用户登录成功与失败的shell脚本

    在Linux上检查用户登录成功与失败的shell脚本 Linux管理员的典型任务之一是检查Linux系统中成功和失败的登录尝试. 手动验证它们非常困难,因为" /var/log/secure ...

  9. linux脚本定时拷贝文件,使用Linux shell脚本实现FTP定时执行批量下载指定文件

    使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1.目标FTP服务器地址 #FTP服务器地址 ip=10.19.15.23 2.FTP账号和密码 u=账号 p=密码 3.使用m ...

最新文章

  1. 「不会开会」是个病,这本书能治吗?
  2. jdbc hibernate ibatis 操作Blob 和Clob类型字段(不断更新)
  3. 前端学习(1666):前端系列实战课程之仿造qq发送消息思路
  4. flex中DataGrid里使用itemRenderer后数据无法绑定到数据源的问题
  5. ant java eclipse_Eclipse之ANT使用
  6. C++_类和对象_C++运算符重载_左移运算符重载_链式编程_实现直接打印对象---C++语言工作笔记056
  7. linux之ps命令
  8. 原生JavaScript如何解决父元素查找指定类名的子元素的问题
  9. 整合了一个命令行程序的框架(1)
  10. DELMIA软件物流仿真:使用输送带输送物料的仿真操作方法
  11. 计算机科学导论第5版ppt,计算机科学导论第5讲-1.ppt
  12. 山海经异兽录找不到服务器,星辰山海经异兽录
  13. PIL中的paste方法拼接透明背景照片
  14. 原始数据哪里找?这些网站要用好!200个国内外数据网站大全
  15. Image Caption Generation原理简介
  16. 再获2亿元A+轮融资,乐生智能能否“扫出”舒适区?
  17. Annotation(注解)是什么?
  18. 新课程改革的理论基础究竟是什么
  19. OpenHarmony OpenSl ES音频录制
  20. Sichuan University Programming Contest 2018 Preliminary

热门文章

  1. 数据千万条,备份第一条:VFEmail被擦除所有数据面临关停
  2. 追本溯源:Oracle 只读表空间的探索实践
  3. 我是一个请求,我该何去何从
  4. 有了这三个神器工具集,应用开发想怎么玩就怎么玩
  5. 云图说|初识数据仓库服务:云时代的数据分析助手
  6. 非暴力拆解:小熊派NB-IoT通信扩展板
  7. 【华为云技术分享】基于ModelArts AI市场算法MobileNet_v2实现花卉分类,支持CPU、GPU、Ascend推理
  8. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
  9. zookeper安装_ZooKeeper的安装与部署
  10. PyCharm将制表符转换为空格并显示的配置方法