【原】Linux shell script 2>&1是什麼意思
先說結論,
2>&1 的意思是,把標準錯誤(stderr)重定向到標準輸出(stdout)
如果想了解為什麼,可以繼續閱讀:
1和2 是什麼
shell中,有一些常用的檔案描述符(file descriptor):
0: 標準輸入(stdin)
1: 標準輸出(stdout)
2: 標準錯誤(stderr)
所以 2>&1 中的2就是標準錯誤,1就是標準輸出。
> 符號是什麼
">" 是shell中的重定向符, 例如:echo "abc" > file1 就是把abc寫到檔名交file1的檔案中。
其中要注意的是,一般"1>" 可以簡寫成">",也就是預設重定向是重定向標準輸出。標準輸入重定向用"<",標準錯誤重定向用"2>",這樣三個標準檔案描述符都能正確的區分重定向了。
&是什麼
&符號在shell中有幾個意思,在2>&1中, &用做一個“轉義符”,和1結合,"&1"一起表示標準輸出。
那為什麼需要&呢?1不是已經表示標準輸出了嗎?
那我們假設我們用這樣shell script:
cat file1 > outfile 2>1
那這樣,系統就會認為,把標準錯誤輸出到檔名是1的檔案中。為了消除歧義,&1在這個情景下,才表示標準輸出,否則單獨的1,就是檔名為1的檔案。
如果你看到一個script是:
cat file1 > outfile 2>&1 &
第二個&(command 最後的&),表示command在後臺執行,意義與&1中的&不同。
這條命令背後是什麼
如果想深入瞭解一下,可以繼續閱讀:
這個命令其實是一個dup2()呼叫。dup2的作用是複製一個現存的檔案描述符。
dup2可以用newfd引數指定新描述符的數值,如果newfd已經開啟,則先將其關閉。如果newfd等於oldfd,則dup2返回newfd, 而不關閉它。dup2函式返回的新檔案描述符同樣與引數oldfd共享同一檔案表項。
dup2等效於:
close(oldfd);fcntl(oldfd, F_DUPFD, newfd);
用strace可以看到, command > file 2>&1 這個命令中實現重定向的關鍵系統呼叫序列是:
open(file) == 3 dup2(3,1) dup2(1,2)
參考文獻
linux之dup和dup2函式解析 linux shell 中"2>&1"含義 shell重定向輸出(1>&2 2>&1 &>file >&file)