關於重定向,看完你就懂了

例子

對於不理解的同學,可以先直接運行一個demo,看看具體有什麼區別,我們從結果來進行分析。

#include<stdio.h>
#include<fcntl.h>
int main()
{
	printf("nihao \n");
	perror("cuowu");
	return 0;
}

之後進行編譯,再測試:
在這裏插入圖片描述
從結果我們可以看出,a.out > outfile 2>&1 將標準輸出和錯誤輸出都重定向到了outfile文件中;a.out 2>&1 > outfile將錯誤輸出輸出到終端,標準輸出到outfile中。(細心的同學可能對第一個輸出的順序感到奇怪,有興趣的可以瞭解一下延遲寫的概念)

分析

首先我們需要了解到linux中如何將文件描述符和磁盤上的文件進行關聯的。在這裏插入圖片描述
在進程中,會將每一個文件描述符進行記錄,將對應的文件描述符指向一個文件表項。該文件表項保存的是文件的狀態標誌(只讀,只寫,可讀可寫)和偏移量等信息,V節點指針指向一個V節點表項。你可以認爲這個V節點表項就是我們磁盤上的具體文件了。

因此你要知道linux中文件描述符文件表項V節點表項相關聯的。

shell爲我們做了那些事情?

我們知道進程中的文件描述符0,1,2。一般都是標準輸入和標準輸出,錯誤輸出的接口。這些其實都是shell爲我們做的配置。它將這三個文件描述符都指向了終端文件表項。纔會出現我們的標準輸入,標準輸出,錯誤輸出都是從終端獲取和輸出。

a.out > outfile 做了哪些事?

我們知道 該語句的效果就是將 a.out 標準輸出重定向到 outfile中。但是從代碼上做了哪些操作呢?將標準輸出文件描述符改1指向outfile的文件表項。而outfile的文件表項中的V節點肯定指向磁盤中的outfile文件。所以最終會輸出到outfile文件中。

fd1>&fd2 是什麼意思?

linux中表示將fd1的文件指針指向fd2的文件指針指向的文件表項。

瞭解以上的知識點以及shell是從左往右進行解析,大概就知道a.out > outfile 2>&1a.out 2>&1 > outfile的區別了。

a.out > outfile 2>&1

a.out > outfile ,表示將 文件描述符1指向outfile的文件表項。 2>&1 ,表示將文件描述符2指向文件描述符1指向文件表項(此時,文件描述符1指向outfile文件表項)。因此a.out 的錯誤輸出和標準輸出都會輸出到outfile文件中。

a.out 2>&1 > outfile

a.out > 2>&1 ,表示將文件描述符2指向文件描述符1指向的文件表項(此時,文件描述符符1指向終端的文件表項)。 > outfile ,表述將文件描述符1指向outfile的文件表項。因此,標準輸出會輸出到outfile中。錯誤輸出會輸出到終端

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章