时间:2020年1月19号

用途:自我学习

目录

重定向和管道

1.标准输入和输出:

2.重定向

2.1输入重定向

2.2输出重定向

3.管道:

4.实例:

4.1输入重定向

4.2输出重定向

4.3管道


重定向和管道

这里先说下与重定向和管道密切相关的一个内容,那就是标准输入输出。

1.标准输入和输出:

IO:

I:从外部设备输出到内存;

O:从内存输出到外部设备。

标准输入和标准输出:

用于IO的外部设备(逻辑上的外部设备)。在Linux中,一切设备皆文件。因此标准输入标准输出更具体的含义是文件。

当我们使用文件描述符进行操作时,需要操作标准输入、标准输出、标准错误,可以包含如下头文件:

#include <unistd.h>

这个头文件中定义了标准设备:

/* Standard file descriptors. /

#define STDIN_FILENO 0 / Standard input. / 默认接受来自键盘的输入

#define STDOUT_FILENO 1 / Standard output. / 默认输出到终端窗口

#define STDERR_FILENO 2 / Standard error output. */ 默认输出到终端窗口

每当启动一个进程的时候,都会有一个默认的stdin和stdout生成,默认情况下,stdin就是键盘,是stdout就是显示器。

比如C语言中:

printf("这是标准输出\n");
//相当于
fprintf(stdout,"这是标准输出\n");
int x;
scanf("%d",&x);
//相当于
fscanf(stdin,"%d",&x);

如何使用标准IO库中的文件操作可参考文章:https://blog.csdn.net/rikeyone/article/details/88668443

2.重定向

重定向:大多数命令行解释器都具有重定向的功能(Unix、Dos、包括我现在学习的UEFI系统中的shell).

输入重定向:可以使程序能够使用文件代替键盘作为输入;

输出重定向:可以使程序能够使用文件代替屏幕作为输出。

文件结尾:操作系统需要某种方式来判断每个文件起始和结束的位置,一般有两种方法:一种是检测文件结尾的的一个特殊字符来进行标识,另一种是让操作系统存储文件大小的信息来进行判断。

对于这两种不同的方法,C的处理方式是让getchar()函数在到达文件结尾时返回一个特殊值,而不管操作系统采用哪种方法,赋予该值得名称是EOF(end of file),其值一般是-1,在stdio.h文件中定义。

可以使用下列程序进行判断是否读入到文件结尾:

while((ch=getchar())!=EOF) // 当ch为EOF时停止

这里需要注意一个问题,EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符,但这适用对文本文件的读写。在二进制文件中,信息都是以数值方式存在的。EOF的值可能就是所要处理的二进制文件中的信息。这就出现了需要读入有用数据却被处理为“文件结束“的情况。为了解决这个问题,C提供了一个feof()函数,可以用它来判断文件是否结束。feof(fp)用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的值是1(真),否则为0(假)。此段摘于链接处文章,详细可参考文章:https://blog.csdn.net/bingqing07/article/details/5785080

2.1输入重定向

:从文件中读取数据

在Windows下需要一个已经编译好的程序test.exe及编写好的符合输入的test.txt文本,则可在DOS下直接使用(注:需这2个文件在同一目录,且DOS已经切换到该目录,否则需要指定路径)

test.exe < test.txt

< 符号是Unix、Linux(和DOS)的重定向运算符,该运算符把test.txt文件与stdin流关联起来,将该文件的内容引导至test.exe程序,程序本身并不知道也不关心输入时来自于文件还是键盘,它只知道的一切就是向它传送了一个字符流,然后进行相应处理,直到遇到文件结尾。

2.2输出重定向

:把stdout重定向到文件,文件内容会被覆盖

>> :把stdout重定向到文件,文件内容不会被覆盖,而是在原有基础上追加内容

2> :把stderr重定向到文件,进行覆盖。

2>> :把stderr重定向到文件,进行追加。

&> or >&  or 2>&1 :把stdout和stderr作为同一个数据流重定向到文件

&>> :把stdout和stderr一起进行重定向追加了

(程序命令;程序命令;...):配合上述格式,可以合并多个程序命令的stdout和stderr来覆盖或追加

注意:stdout和stderr分开输出到不同文件时,必须是stdout在前,stderr在后,也就是2>2>>2>&1都需要在正确输出的后面。

具体的写法如下:

command > /path/to/file.out 2> /path/to/error.out
command >> /path/to/file.all.out 2>>/path/to/error.out
command > /path/to/file.all.out 2>&1 == command &> /path/to/file.all.out == command >& /path/to/file.all.out

在Windows下需要一个已经编译好的程序OutPutTest.exe则可在DOS下直接使用.

OutPutTest.exe > OutPutTest.txt

程序的输出结果不会在DOS下打印,而会直接存入OutPutTest.txt 中。符号将输出重定向到该文件,该重定向将stdout从显示设备重定向到OutPutTest.txt文本文件,

:用 >输出重定向时若没有对应的输出文件时,会自动创建,若已存在,会删除原文件并建立新文件代替。

3.管道:

管道就是一个进程与另一个进程之间通信的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入。它是半双工运作的,想要同时双向传输需要使用两个管道。管道又可以分为匿名管道和命名管道,而shell中使用到的是匿名管道,所以这里仅简单描述匿名管道。

例如命令 ls | grep main.c ,使用了管道来连接了两条命令来执行,能够快速地让我们知道当前目录下是否有 main.c 文件。

管道的本质是内存中的缓冲区,可以看作是打开到内存中的文件。所以需要使用两个文件描述符来索引它,一个表示读端,一个表示写端。并且规定,数据只能从读端读取、只能往写端写入

管道符号“|”用来连接命令:

command 1 | command 2 | command 3

上述是将command 1的stdout 发送给command 2的stdin,command 2 的stdout 发送给command 3的stdin,最后command 3的会在当前shell进程的子shell进程中执行出来。

4.实例:

4.1输入重定向

test.c:

#include <stdio.h>
#if 1
int main()
{char ch;while ((ch = getchar()) != EOF)     //读取输入字符{putchar(ch);       //输出字符}putchar('\n');return 0;
}
#endif

test.txt:

This is an input redirection test.
这是一个输入重定向测试

运行结果:

4.2输出重定向

OutPutTest.c

#include <stdio.h>
#if 1
int main()
{printf("This is an output redirection test instense\n");return 0;
}
#endif

运行结果:

4.3管道

OutPutTest.c:

#include <stdio.h>
#if 1
int main()
{printf("This is an output redirection test instense\n");return 0;
}
#endif

InputTest.c

#include <stdio.h>
#if 1
int main()
{char ch;printf("This is ths input instense\n");while ((ch = getchar()) != EOF)     //读取输入字符{putchar(ch);       //输出字符}putchar('\n');return 0;
}
#endif

运行结果:

重定向、管道及标准输入标准输出相关推荐

  1. Bash基础(2) 通配符 组合键 数据重定向 管道 tee

    Bash基础(2)     通配符  组合键  数据重定向  管道  tee命令 1 文本名"通配符" *:匹配任意长度的任意字符: ?:匹配任意单个字符: []: 匹配指定范围内 ...

  2. Linux Shell重定向 管道命令 grep搜索 awk编程 sed文件操作高阶函数

    在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍. 作者:有勇气的牛排 文章目录 1 shell重定向 ...

  3. Linux重定向管道——双通、三通管道一篇学会【CenOs】

    Linux重定向管道是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变. 如: date > date.txt 将日期输出到date文件 FD:file descriptors , ...

  4. linux-命令替换-通配符-重定向-管道

    命令替换:$(command),`command` touch ./file-$(date +%F-%H-%M_%S).txt bash支持的引号有三种: ``:命令替换 "":弱 ...

  5. linux命令基础知识 管道流,linux基础知识-I/O重定向,管道(示例代码)

    系统设定 默认输出设备:标准输出,STDOUT, 1 默认输入设备:标准输入, STDIN, 0 标准错误输出:STDERR, 2 标准输入:键盘 标准输出和错误输出:显示器 I/O重定向: Linu ...

  6. Android中使用logwrapper来重定向应用程序的标准输出

    在Android应用程序调试中,有时候第三方应用程序的日志输出是通过printf之类的标准函数输出的,logcat不能捕获这些日志,一个方法是使用logwrapper命令来执行第三方应用程序,logw ...

  7. linux终端模拟器stdin,linux输出·输入文件和标准输入 标准输出是什么意思啊

    满意答案 nono_yf 推荐于 2017.09.03 采纳率:55%    等级:11 已帮助:4087人 Unix/Linux/BSD 都有三个特别文件,分别 1)标准输入 即 STDIN , 在 ...

  8. nohup: 重定向标准错误到标准输出

    解决: 加上2>&1 nohup ${JAVA_HOME}/bin/java ${JAVA_PARAM}  -classpath ${LIB} ${CLASS_MAIN}  > . ...

  9. Linux重定向+管道命令+环境变量PATH

    目录 ⛺️1.了解Linux目录配置标准FHS ⛺️2. Linux数据重定向的理解与操作

  10. C++ 标准输入,标准输出,标准错误和标准日志

    C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍.本章将讨论 C++ 编程中最基本和最常见的 I/O 操作. C++ 的 I/O 发生在流中,流是字节序列.如果字节流是从设备( ...

最新文章

  1. 围绕云计算 虚拟化技术又呈现新面貌
  2. linux下的daemon进程
  3. C++ 获得指定路径文件的“修改日期”
  4. oralce主键自动生成
  5. 3.1.2 vernam 代数密码
  6. spring data redis 使用之 spring boot 2.x
  7. 树莓4派开机动画_树莓派4+无屏幕安装系统+ssh远程+远程桌面
  8. cmd oracle 连接实例_C#连接Oracle数据库的实例方法
  9. 阿里云宣布3年再投2000亿
  10. C++:连接MySQL
  11. 【JVM系列】一步步解析java执行内幕,java初级面试笔试题
  12. Oracle role and user privileges
  13. ubuntu desktop的分辨率设置
  14. 【渝粤教育】国家开放大学2019年春季 2727税收基础 参考试题
  15. Wincc 开机自检动态展示
  16. 陶哲轩实分析 3.1节 习题试解
  17. div绑定onblur事件
  18. ubuntu 扩充交换空间
  19. LeetCode 695. 岛屿的最大面积【c++/java详细题解】
  20. Excel数据导入到hbase实战

热门文章

  1. 利用cad计算型材的弹性模量_常用材料弹性模量
  2. Prepar3d.cfg
  3. 获取select下面选中的value值和文本值。--http://blog.163.com/yiba_suanzao/blog/static/130557377201038113543135/
  4. 代码版本,项目管理工具,轻应用
  5. 【Linux进程】六、wait()函数——子进程回收
  6. 写代码做副业月入10K+的方法经验都藏在这几个温柔、漂亮小姐姐运营的公众号了...
  7. 【Redis】4、详解三种特殊数据类型 Geospatial、Hyperloglog、Bitmap
  8. linux VM虚拟机安装步骤
  9. web学习笔记16-移动端地址选择功能@v2.0封装
  10. python图书馆抢座_python实现图书馆抢座(自动预约)功能的示例代码