最近筆試遇到一道題,關於Linux命令的,題目以下shell
下面兩條命令分別會有怎樣的輸出vim
echo hello 1>&2 |grep aaabash
echo hello 2>&1 |grep aaa工具
A、兩個均輸出hello B、第一個無輸出,第二個輸出 hello C、第一個輸出hello,第二個無輸出 D、兩個均輸出hellospa
思考了幾分鐘,選了C。正所謂良莠不齊就選C,emmm實際上是瞎選的,1>&2這個知識點博主忘了,因此今天就來複習一下code
echoorm
功能:顯示器上顯示一段文字,通常起到一個提示的做用。blog
參數:-b
表示刪除前面的空格 -n
表示換行 -t
表示水平製表符 -v
表示垂直製表符
-c 後面的字符將不會輸出,同一時候,輸出完畢後也不會換行 -r
輸出回車符(但是你會發現\r前面的字符沒有了) -a
表示輸出一個警告聲音input
[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
grepclass
功能:文本過濾工具,是 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 的理解,有什麼不對的你們也能夠提出來一塊兒討論
-------------------------------------------------------------------------------
轉載請註明出處、做者 ,謝謝