天天看點

Linux指令- echo、grep 、重定向、1>&2、2>&1的介紹

Linux指令- echo、grep 、重定向、1>&2、2>&1的介紹

最近筆試遇到一道題,關于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 表示輸出一個警告聲音

1

2

[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 : 顯示不包含比對文本的所有行

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[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

[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檔案,而不是顯示在螢幕上

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,也就是終端螢幕

[chen@localhost file]$ echo hello 1>2 //hello 重定向輸出到2這個檔案中去

2 file.c

[chen@localhost file]$ cat 2

[chen@localhost file]$

講到這裡相信對重定向也有一定的了解了吧,下面回到開頭那道題

答:第一個輸出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 的了解,有什麼不對的大家也可以提出來一起讨論

原文位址

https://www.cnblogs.com/cyyz-le/p/11305004.html

繼續閱讀