最近笔试遇到一道题,关于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. Codeforces Round #564 (Div. 2)B

    B. Nauuo and Chess 题目链接:http://codeforces.com/contest/1173/problem/B 题目 Nauuo is a girl who loves pl ...

  2. 记录微信浏览器里word链接点击没反应的bug

    有用户反应点击下载附件时没有反应,让用户把该下载链接复制到微信对话框中,发现点击该链接仍然无反应,但是在内置的手机浏览器中打开是正常的而且可以下载. 链接地址,有需要的可以拿去进行测试: http:/ ...

  3. C#使用 SSL Socket 建立 Client 与 Server 连接

    当 Client 与 Server 需要建立一个沟通的管道时可以使用 Socket 的方式建立一个信道,但是使用单纯的 Socket 联机信道可能会担心传输数据的过程中可能被截取修改因而不够安全,为了 ...

  4. Docker-Compose搭建单体SkyWalking

    SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...

  5. archery 平台升级部署实践

    v1.3.8 → v1.5.0 1.安装.升级python3 venv 环境 1.1.安装 python36 全新安装需要执行,升级安装可忽略 https://www.cnblogs.com/Davi ...

  6. iOS 国际化 (国际化文字内容不改变,app名字国际化,一键切换语言)

    首先我们要分三个步骤讲解怎么一步步实现app名字国际化.内容国际化.一键切换国际化的: 一.app设置内容或者可以说是app名字或者可以说Info.Plist中的东西国际化  app名字国际化  1. ...

  7. intel FPGA CLKn pin 是否能直接进PLL?

    原创 by DeeZeng FPGA的时钟需要从专用的时钟管脚输入,那CLKn 作为Single-End时钟pin时是否能直接进 PLL呢? 通过查看对应FPGA型号的手册,得出以下结论 1. Cyc ...

  8. 学习springboot整合mybatis并编写测试类

    报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 遇到的问题: 1.原因是在启动类上只有一个@Map ...

  9. Windows Presentation Foundation (WPF) 项目中不支持xxx的解决

    一般Windows Presentation Foundation (WPF) 项目中不支持xxx都是由于没引用相应的程序集导致,比如Windows Presentation Foundation ( ...

  10. 查看内存的方法。vs-调试-窗口-内存

    1.vs-调试-窗口-内存 2.把指针复制到内存窗口中,就可以查看窗口的内存了.