Erlo

Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍

2019-08-05 20:00:28 发布   606 浏览  
页面报错/反馈
收藏 点赞

最近笔试遇到一道题,关于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>&1  将错误输出重定向到标准输出,由于没有错误,所以没有输出

后面那个grep aaa 我猜可能是为了混淆题意吧hh

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

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

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认