最近笔试遇到一道题,关于Linux命令的,题目如下

下面两条命令分别会有怎样的输出

echo  hello 1>&2 |grep aaa

echo  hello 2>&1 |grep aaa

A、两个均输出hello   B、第一个无输出,第二个输出 hello   C、第一个输出hello,第二个无输出 D、两个均输出hello

思考了几分钟,选了C。正所谓参差不齐就选C,emmm其实是瞎选的,1>&2这个知识点博主忘了,所以今天就来复习一下

echo

功能:显示器上显示一段文字,一般起到一个提示的作用。

参数:-b 表示删除前面的空格
   -n 表示换行
   -t 表示水平制表符
   -v 表示垂直制表符
   -c 后面的字符将不会输出,同一时候,输出完毕后也不会换行
   -r 输出回车符(可是你会发现\r前面的字符没有了)
   -a 表示输出一个警告声音

[chen@localhost media]$ echo   hello
hello
[chen@localhost media]$ echo   $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/chen/.local/bin:/home/chen/bin

grep

功能:文本过滤工具,是 Linux 系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据

参数 :-n : 显示匹配的行号及行
       -i : 不区分大小写
       -c : 只输出匹配的行数
       -h : 查询多文件时不显示文件名
       -l : 查询多文件时, 只输出包含匹配字符的文件名  
       -v : 显示不包含匹配文本的所有行

[chen@localhost media]$ grep  int new1.c
int data;
int compare(const void *p, const void *q) {
int const *a = (int const *)p;
int const *b = (int const *)q;
int show(int *p, int n) {
int i = 0;
printf("%d ", p[i]);
int input(int *p, int n) {
int i = 0;
int main()
int p[100] = { 0 };
[chen@localhost media]$ grep -n int new1.c
8: int data;
13:int compare(const void *p, const void *q) {
14: int const *a = (int const *)p;
15: int const *b = (int const *)q;
25:int show(int *p, int n) {
26: int i = 0;
28: printf("%d ", p[i]);
33:int input(int *p, int n) {
34: int i = 0;
42:int main()
44: int p[100] = { 0 };
[chen@localhost media]$ grep -c int new1.c
11 

重定向

定义:Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。

重定向输入就是让程序使用文件而不是键盘来输入,重定向输出就是让程序输出至文件而不是屏幕 

I/O重定向通常与 FD 有关,shell的FD通常为10个,即 0~9;

重点:常用 FD有3个,为 0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出)

用 < 来改变读进的数据信道(stdin),使之从指定的档案读进

用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;

0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;

[chen@localhost media]$ vim  file.c//创建一个空文件
[chen@localhost media]$ echo hello > file.c //输出hello到空文件中
[chen@localhost media]$ cat file.c //文件就存了hello
hello
[chen@localhost media]$ > file.c //快速清空文件内容的快捷键就是基于这个输出重定向来完成的 1> file.c 也是同样的作用
[chen@localhost media]$ cat file.c //文件里的hello已经被清空
[chen@localhost media]$    

FD 2 错误输出,就是当输出错误时,用 2>  可以输出错误的返回值

[chen@localhost media]$ cat file.c
[chen@localhost media]$ hello 2> file.c //将错误信息重定向输出到file.c文件,而不是显示在屏幕上
[chen@localhost media]$ cat file.c
bash: hello: 未找到命令...
[chen@localhost media]$

&是文件描述符,&2 表示错误通道2,echo  hello 1>&2 表示hello 重定向输出到错误通道2

回忆一下,我们在终端敲命令错误屏幕就会报错,我们把屏幕报错显示的地方当成错误通道2就容易理解了

如果不加&2 直接 echo  hello 1>2  就变成hello 重定向输出到2这个文件里去了,如果没有2,系统就自动创建一个2

[chen@localhost file]$ ls
file.c
[chen@localhost file]$ echo hello 1>&2 //hello 重定向输出到错误通道2,也就是终端屏幕
hello
[chen@localhost file]$ echo hello 1>2 //hello 重定向输出到2这个文件中去
[chen@localhost file]$ ls
2 file.c
[chen@localhost file]$ cat 2
hello
[chen@localhost file]$

讲到这里相信对重定向也有一定的理解了吧,下面回到开头那道题

下面两条命令分别会有怎样的输出

echo  hello 1>&2 |grep aaa

echo  hello 2>&1 |grep aaa

答:第一个输出hello,第二个无输出,解析如下

1>&2  将正确输出重定向到标准错误2通道

2>&1  将错误输出重定向到标准输出1通道

echo  hello 1>&2 后面跟了一个 | grep aaa

| 是管道,意思就是将第一条指令的结果放到第二条指令中,管道命令右边只处理左边的标准正确输出,也就是通道1

echo  hello    1>&2   将结果输出到错误2通道,也就是在终端屏幕上显示hello,而标准输出1通道没有值,| grep aaa 搜素左边传来的标准输出通道1的结果,发现没有aaa,所以没有输出,最终屏幕只显示一个hello

echo  hello    2>&1   将错误返回值输出到标准1通道,不过该语句正确,没有错误,通道2也就为空,屏幕没有显示,| grep aaa 搜素左边传来的标准输出通道1的结果,通道1有hello 但是没有 aaa  所以没有输出,所以屏幕没有显示

再帮大家加深一下,如果换一下,改成 echo  hello    1>&2 | grep  e  和 echo  hello    2>&1 | grep  e  呢?

echo  hello    1>&2   将正确结果hello输出到错误2通道,也就是在终端屏幕上显示hello,而标准输出1通道没有值,| grep aaa 搜素左边传来的标准输出通道1的结果,发现没有hello,所以没有输出,最终屏幕只显示一个hello

echo  hello    2>&1   将错误返回值输出到标准1通道,不过该语句正确,没有错误,通道2也就为空,屏幕没有显示,| grep aaa 搜素左边传来的标准输出通道1的结果,发现有e,所以输出hello

通道2会在屏幕上显示,通道1不会在屏幕上显示,记住这句话,这句话是针对管道的第一个命令,大家别误解了,把管道命令左边命令的通道1的值给右边命令,右边命令再输出,如果正确,输出通道1,错误,输出通道2

这就是我对重定向  ,1>&2 , 2>&1 的理解,有什么不对的大家也可以提出来一起讨论

-------------------------------------------------------------------------------

转载请注明出处、作者 ,谢谢

Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍的更多相关文章

  1. 每天学点Linux命令之grep 和 wc命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  2. 每天学点Linux命令之grep 和 wc命令 ---(6/25)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  3. 每天学点Linux命令之grep 和 wc命令 --- !管道命令!

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  4. linux命令echo和cat比较

    当前主要比较echo 和 cat的重定向功能 1.echo 1 > /proc/xxx 解析: echo 进行重定向的时候,仅仅是将字符"1" 输出到 /proc/xxx文件 ...

  5. Linux命令echo -e

    在Linux命令中 echo -e 这个参数e是什么意思. echo –e “I will use ‘touch’ command to create 3 files.” 这里参数e的作用是什么 ma ...

  6. 【linux命令】grep

    1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...

  7. linux命令之grep用法介绍

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  8. 每天一个linux命令(51)--grep命令

    linux系统中grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep 全称是 global regular expression print,表示全局正则 ...

  9. 【Linux命令】grep命令

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...

随机推荐

  1. ECShop安装问题

    Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG 在安装Ecshop的时候,遇到两个问题: 1.Strict Standards: Non-static ...

  2. 微信小程序源码

    内带scroll滚动轮播:如图:       微信小程序开发工具:微信开发工具: 文件目录: images:小程序的图标 pages:小程序页面 utils:方法js git地址:https://gi ...

  3. 3. Django每日一码 之 Serializers 源码

    2019-7-6 今日源码:rest-framework 序列化Serializers 序列化组件Serializers 源码分析 首先,它需要 data .many . instance,其中 in ...

  4. Java开发面试题汇总 -- 精选版(附答案)

    最近事情太多,没太时间写公众号.今天抽空再整理整理面试中的那点事吧,帮助那些正在找工作或想跳槽找工作的兄弟姐妹们. 前面我己写过多篇推文,相信关注此公众号的伙伴们已经了解掌握了不少.从目前流行的开发技 ...

  5. MyBatis从入门到精通:select较深层次的用法

    一,简单的情形 需求: 根据用户id获取用户拥有的所有角色,返回的结果为角色集合. 1.接口中增加的方法: List<SysRole> selectRolesByUserId(Long u ...

  6. 最全caffe安装踩坑记录(Anaconda,nvidia-docker,Linux编译)

    Anaconda,nvidia-docker,Linux三种方式安装caffe 1.Anaconda安装caffe 1.首先安装anaconda 2.创建虚拟环境(python2.7) conda c ...

  7. 使用GDAL实现DEM的地貌晕渲图(二)

    1. 问题 之前我在<使用GDAL实现DEM的地貌晕渲图(一)>这篇文章里面讲述了DEM晕渲图的生成原理与实现,大体上来讲是通过计算DEM格网点的法向量与日照方向的的夹角,来确定该格网点的 ...

  8. MyBatis一对多和多对多xml配置

    MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ma ...

  9. python正则表达式与re模块-02

    正则表达式 正则表达式与python的关系 # 正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则 # 但要在python中使用正则表达式,就必须依赖于python内置 ...

  10. Java SE API 8

    百度云: 链接:http://pan.baidu.com/s/1pLMwiKz 密码:ep5f 官网网址:http://www.oracle.com/technetwork/java/javase/d ...