將標準輸出和標準錯誤重定向到文件的符合 POSIX 標準的方法
我正在嘗試編寫一個符合 POSIX 的腳本,因此它可以在任何 *nix 系統(Debian、Fedora、CentOS、AIX、Arch ……所有這些)上執行。談到重定向,我對 POSIX 支持什麼以及不支持什麼感到困惑。
如果我重定向
ls -l file missingfile &> out.txt
這在bash
.stderr
抱怨missingfile
不存在的行和 , 的權限輸出file
都在out.txt
. 但是,我相信這只是因為這些 shell 支持的不僅僅是 POSIX 標準運算符。在研究這個問題時,我遇到了相互矛盾的答案。例如,這個 stackexchange answer似乎暗示
&>
,>&
和是非標準操作。但是,這個答案明確指出這是符合 POSIX 的。這是否意味著運算符(使用數字表示& )是 POSIX 兼容的,而用於自動重定向和文件不兼容 POSIX?還是兩者都符合POSIX/POSIX 標準(這兩個人中的一個是錯誤的)?>>&``&>>``some-program > some_file 2>&1``>&``stderr``stdout``&>``stderr``stdout``&>``>&
我考慮過完全避免使用該
&
標誌並使用ls -l file missingfile >out.txt 2>out.txt
它,但這有其自身的問題。以這種方式執行ls
命令會導致 shell 打開 的兩個文件句柄out.txt
,都指向文件中的偏移量 0。因此,當ls
查找這兩個文件時,其中一條消息被破壞了。期望
ls -l file missingfile >out.txt 2>out.txt
輸出什麼:-rw-r--r-- 1 blah blah 0 Jun 3 13:18 file ls: cannot access 'missingfile': No such file or directory
實際輸出的是什麼:
-rw-r--r-- 1 blah blah 0 Jun 3 13:18 file le or directory
以符合 POSIX的方式重定向
stdout
和重定向到文件的最佳方法是什麼?stderr
您可以檢查POSIX 規範。這種語言並不總是很容易理解,但如果你知道你在尋找什麼,你就可以知道它是否存在。
POSIX 包括重定向操作,其中N是可選的文件描述符編號(預設為 0 表示輸入,1 表示輸出),word可以是:
*N*>&*word*``*N*<&*word*
- 一個數字序列,用於將文件描述符N重定向到**word上已經打開的任何內容。
- 字元
-
, 關閉文件描述符N。
>out.txt 2>&1
將標準輸出和標準錯誤重定向到out.txt
. 它也適用於 pre-POSIX Bourne shells。
>&
後跟文件名是某些 shell(包括 bash)中的副檔名,它將 stdout 和 stderr 都重定向到該文件。
&>``>&
是bash(和 zsh)中後跟文件名的同義詞。即使文件名是數字序列或-
(例如foo >&"$a"
,等效於foo 1>&3 2>&1
if 的值a
是 digit3
,但等於 iffoo >myfile 2>&1
的a
值),它也具有工作的優勢myfile
。它的缺點是它與 POSIX 不兼容。在符合 POSIX 的 shell 中,echo foo &>bar
被解析為命令echo foo
、&
操作符和命令>bar
:列印的後台程序foo
和創建或清空文件的前台程序bar
。