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

  • 2019 年 10 月 3 日
  • 筆記

最近筆試遇到一道題,關於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 的理解,有什麼不對的大家也可以提出來一起討論

——————————————————————————-

轉載請註明出處、作者 ,謝謝