linux脚本实现多重管道,制作Linux shell时流重定向和管道
我有一个在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时流重定向和管道相关推荐
- linux脚本怎么获取参数,在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?...
Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多.如:[ip]命令可以配置IP地址.路由条目的配置管理操作非常完善,该命令就可以完成[ifconfig]和[route]命令实现 ...
- jsp运行linux脚本,jsp页面调用哪个Linux的shell 脚本步骤
当前位置:我的异常网» Linux/Unix » jsp页面调用哪个Linux的shell 脚本步骤 jsp页面调用哪个Linux的shell 脚本步骤 www.myexceptions.net 网 ...
- linux脚本用户输入,如何在Linux shell脚本中提示用户输入
本篇文章给大家介绍关于如何在Linux shell脚本中提示用户输入?下面来看具体的内容. 我们首先来看一下命令# read var # read -s "Waiting for input ...
- linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...
- linux 脚本$字符,一文看懂shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义
概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 今天主要介绍一下 ...
- linux脚本运行java程序设计_Java运行Shell脚本
利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序.参考了互联网上的这篇文章,我重新整理了代码. 现在通过CommandHelper.ex ...
- linux脚本语言求累加和,Linux Shell脚本语言与数学表达式
当你理解了Shell脚本,每当需要时都能流畅编写时,那种感觉很爽的.本章中,我们将教你用脚本语言进行比较复杂的数学运算. 让我们从斐波那契数列开始吧. 斐波那契数列,又称黄金分割数列,指的是这样一个数 ...
- linux脚本登录启动失败,在Linux上检查用户登录成功与失败的shell脚本
在Linux上检查用户登录成功与失败的shell脚本 Linux管理员的典型任务之一是检查Linux系统中成功和失败的登录尝试. 手动验证它们非常困难,因为" /var/log/secure ...
- linux脚本定时拷贝文件,使用Linux shell脚本实现FTP定时执行批量下载指定文件
使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1.目标FTP服务器地址 #FTP服务器地址 ip=10.19.15.23 2.FTP账号和密码 u=账号 p=密码 3.使用m ...
最新文章
- 「不会开会」是个病,这本书能治吗?
- jdbc hibernate ibatis 操作Blob 和Clob类型字段(不断更新)
- 前端学习(1666):前端系列实战课程之仿造qq发送消息思路
- flex中DataGrid里使用itemRenderer后数据无法绑定到数据源的问题
- ant java eclipse_Eclipse之ANT使用
- C++_类和对象_C++运算符重载_左移运算符重载_链式编程_实现直接打印对象---C++语言工作笔记056
- linux之ps命令
- 原生JavaScript如何解决父元素查找指定类名的子元素的问题
- 整合了一个命令行程序的框架(1)
- DELMIA软件物流仿真:使用输送带输送物料的仿真操作方法
- 计算机科学导论第5版ppt,计算机科学导论第5讲-1.ppt
- 山海经异兽录找不到服务器,星辰山海经异兽录
- PIL中的paste方法拼接透明背景照片
- 原始数据哪里找?这些网站要用好!200个国内外数据网站大全
- Image Caption Generation原理简介
- 再获2亿元A+轮融资,乐生智能能否“扫出”舒适区?
- Annotation(注解)是什么?
- 新课程改革的理论基础究竟是什么
- OpenHarmony OpenSl ES音频录制
- Sichuan University Programming Contest 2018 Preliminary
热门文章
- 数据千万条,备份第一条:VFEmail被擦除所有数据面临关停
- 追本溯源:Oracle 只读表空间的探索实践
- 我是一个请求,我该何去何从
- 有了这三个神器工具集,应用开发想怎么玩就怎么玩
- 云图说|初识数据仓库服务:云时代的数据分析助手
- 非暴力拆解:小熊派NB-IoT通信扩展板
- 【华为云技术分享】基于ModelArts AI市场算法MobileNet_v2实现花卉分类,支持CPU、GPU、Ascend推理
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
- zookeper安装_ZooKeeper的安装与部署
- PyCharm将制表符转换为空格并显示的配置方法