1. 程式人生 > >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 表示輸出一個警告聲音

[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 的理解,有什麼不對的大家也可以提出來一起討論

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