最近笔试遇到一道题,关于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. WebGL概述

    WebGL,是一项用来在网页上绘制和渲染复杂三维图形(3D图形),并允许用户与之交互的技术.WebGL基于OpenGL ES 2.0,使用GLSL ES语言编写着色器.而 OpenGL ES (Ope ...

  2. PATB 1032 挖掘机技术哪家强(20)

    #include <cstdio> #include <vector> using namespace std; const int N = 100001; vector &l ...

  3. Oracle 聚集函数

    (1)avg(x):返回x的平均值 select avg(grade) from sc; (2)count(x):返回统计的行数 select count(name) from sc; (3)max( ...

  4. Maven下载Jar包(bat脚本)

    1.创建一个bat文件叫download.bat 2.里面写入以下代码 call mvn -f pom.xml dependency:copy-dependencies 3.创建pom.xml文件 4 ...

  5. spark入门(四)日志配置

    1 背景 在测试spark计算时,将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是很难的,因为作业是提交到yarn的集群上,所以,去yarn集群上看 ...

  6. 基础数据类型,格式化输出,以及for循环的使用

    基础数据类型总览 int :数字类型,可以+-*/等等操作 str:字符串类型,存储少量的数据,+*int 切片等 bool :里面包含True,False这两种值,用来判断真假. list :列表 ...

  7. C++一些知识的整理

    1. C 和 C++ 区别 C++支持多种编程范式:面向对象编程.泛型编程.过程化编程.支持类.封装.重载等特性. c和c++的头文件不同. 输入输出不同. 变量的声明定义不同:c语言:变量要放在语句 ...

  8. 关于 https的SNI问题

    遇到的问题,服务器多站点配置HTTPS 后遇到的问题,服务器报警告错误. 随后网上搜索了下 SNI的意义. 这句话很经典: SNI(Server Name Indication)是为了解决一个服务器使 ...

  9. Element-ui DatePicker显示周数

    1.场景描述 我们公司是做电商的,运营的工作指标都是按周来定的,所以他们对周特别敏感,希望我们能在日期选择器上显示周数.刚接到这个需求时,心中很不乐意,因为Element-ui的日期选择器根本不支持显 ...

  10. MFC在一个工程中启动其他工程的exe文件

    说明:有的时候把两个工程合并,但是偷懒不想在工程中添加代码,所以想到了这个办法,仅限偷懒哈哈哈哈 方法:新建一个主程序,在主程序的界面中添加按钮,在按钮的程序代码中添加以下语句: void CMain ...