1. 程式人生 > 其它 >linux 2>&1 和 &的意思

linux 2>&1 和 &的意思

先上程式碼

$ command > file 2>&1 
$ command >> file 2>&1

這裡的&沒有固定的意思
放在>後面的&,表示重定向的目標不是一個檔案,而是一個檔案描述符,內建的檔案描述符如下:

1 -> stdout
2 -> stderr
0 -> stdin

換言之 2>1 代表將stderr重定向到當前路徑下檔名為1的regular file中,而2>&1代表將stderr重定向到檔案描述符為1的檔案(即/dev/stdout)中,這個檔案就是stdout在file system中的對映
而&>file是一種特殊的用法,也可以寫成>&file,二者的意思完全相同,都等價於

>file 2>&1

此處&>或者>&視作整體,分開沒有單獨的含義
順序問題:

find /etc -name .bashrc > list 2>&1
# 我想問為什麼不能調下順序,比如這樣
find /etc -name .bashrc 2>&1 > list

這個是從左到右有順序的
第一種

xxx > list 2>&1

先將要輸出到stdout的內容重定向到檔案,此時檔案list就是這個程式的stdout,再將stderr重定向到stdout,也就是檔案list
第二種

xxx 2>&1 > list

先將要輸出到stderr的內容重定向到stdout,此時會產生一個stdout的拷貝,作為程式的stderr,而程式原本要輸出到stdout的內容,依然是對接在stdout原身上的,因此第二步重定向stdout,對stdout的拷貝不產生任何影響

對於上面 '2>&1',舉個例子,比如說:

$ find /etc -names "*.txt"  >list 2>&1

從左往右執行,執行到 >list,此時的 stdout 為 list;而執行到 2>&1,表示 stderr 重定向到 stdout,這裡也就是 list 檔案。
因為 [ find /etc -names "*.txt" ] 這條命令是錯誤的( -names 應該是 -name)。
本來要輸出到終端螢幕的錯誤資訊:

find: unknown predicate `-names`

被重定向到了 stdout 也就是 list 檔案中,所以螢幕不會出現錯誤資訊,而是列印到了 list 檔案中。
cat list 可以檢視到 find: unknown predicate `-names' 就在裡面。
更粗暴的理解:
試想2>1代表什麼,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個檔案1,而不代表標準輸出;
換成2>&1,&與1結合就代表標準輸出了,就變成錯誤重定向到標準輸出;

最後一個& , 是讓該命令在後臺執行。

 先上程式碼
$ command > file 2>&1 
$ command >> file 2>&1

這裡的&沒有固定的意思
放在>後面的&,表示重定向的目標不是一個檔案,而是一個檔案描述符,內建的檔案描述符如下:

1 -> stdout
2 -> stderr
0 -> stdin

換言之 2>1 代表將stderr重定向到當前路徑下檔名為1的regular file中,而2>&1代表將stderr重定向到檔案描述符為1的檔案(即/dev/stdout)中,這個檔案就是stdout在file system中的對映
而&>file是一種特殊的用法,也可以寫成>&file,二者的意思完全相同,都等價於

>file 2>&1

此處&>或者>&視作整體,分開沒有單獨的含義
順序問題:

find /etc -name .bashrc > list 2>&1
# 我想問為什麼不能調下順序,比如這樣
find /etc -name .bashrc 2>&1 > list

這個是從左到右有順序的
第一種

xxx > list 2>&1

先將要輸出到stdout的內容重定向到檔案,此時檔案list就是這個程式的stdout,再將stderr重定向到stdout,也就是檔案list
第二種

xxx 2>&1 > list

先將要輸出到stderr的內容重定向到stdout,此時會產生一個stdout的拷貝,作為程式的stderr,而程式原本要輸出到stdout的內容,依然是對接在stdout原身上的,因此第二步重定向stdout,對stdout的拷貝不產生任何影響

對於上面 '2>&1',舉個例子,比如說:

$ find /etc -names "*.txt"  >list 2>&1

從左往右執行,執行到 >list,此時的 stdout 為 list;而執行到 2>&1,表示 stderr 重定向到 stdout,這裡也就是 list 檔案。
因為 [ find /etc -names "*.txt" ] 這條命令是錯誤的( -names 應該是 -name)。
本來要輸出到終端螢幕的錯誤資訊:

find: unknown predicate `-names`

被重定向到了 stdout 也就是 list 檔案中,所以螢幕不會出現錯誤資訊,而是列印到了 list 檔案中。
cat list 可以檢視到 find: unknown predicate `-names' 就在裡面。
更粗暴的理解:
試想2>1代表什麼,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個檔案1,而不代表標準輸出;
換成2>&1,&與1結合就代表標準輸出了,就變成錯誤重定向到標準輸出;

最後一個"&", 是讓該命令在後臺執行。