最近笔试遇到一道题, 关于 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 的理解, 有什么不对的大家也可以提出来一起讨论
来源: https://www.cnblogs.com/cyyz-le/p/11305004.html