天天看點

關于linux 重定向的淺析

1.檔案描述符的概念

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三個, 分别是:

0 是一個檔案描述符,表示标準輸入(stdin)

1 是一個檔案描述符,表示标準輸出(stdout)

2 是一個檔案描述符,表示标準錯誤(stderr)

在标準情況下, 這些FD分别跟如下裝置關聯:

stdin(0): keyboard 鍵盤輸入,并傳回在前端

stdout(1): monitor 正确傳回值 輸出到前端

stderr(2): monitor 錯誤傳回值 輸出到前端

舉例說明吧:假如目前目錄隻有一個檔案 1.txt

[root@xgmin]# ls

1.txt

[root@xgmin]# ls 1.txt 2.txt

ls: 2.txt: No such file or directory 傳回錯誤值, 這就是2輸出 ,1``.txt 而這個就是所謂的1輸出

2.重定向解析

a.2>&1經常使用的這個2>&1,怎麼了解呢?

對于2>&1的了解,2就是标準錯誤,1是标準輸出,那麼這條指令就是相當于把标準錯誤重定向 到标準輸出。為什麼是&1而不是1,這裡& 符号可以了解為引用(reference)。&1 就是對标準輸出的引用。

b.>&2 即 1>&2 也就是把結果輸出到和标準錯誤一樣;之前如果有定義标準錯誤重定向到某log檔案,那麼标準輸出也重定向到這個log檔案

如:ls 2>a1 >&2 (等同 ls >a1 2>&1)把标準輸出和标準錯誤都重定向到a1,終端上看不到任何資訊。

c.ls a.txt >a 2>a 和 ls a.txt >a 2>&1的差別

可以了解為執行ls a.txt産生的标準輸入重定向到檔案a中,标準錯誤也重定向到檔案a中。

看起來ls a.txt >a 2>&1等價于ls a.txt 1>a 2>&1。在IO效率講還是有差別的,差別就在于前者隻打開一次檔案a,後者會打開檔案兩次,并導緻stdout被stderr覆寫。&1的含義就可以了解為用标準輸出的引用,引用的就是重定向标準輸出産生打開的a。從IO效率上來講,command 1>a 2>&1比 command 1>a 2>a的效率更高。

3.bash之shell反彈

https://blog.csdn.net/Auuuuuuuu/article/details/89059176,這裡寫的很清楚。