Shell

將標準輸出和標準錯誤重定向到文件的符合 POSIX 標準的方法

  • June 6, 2020

我正在嘗試編寫一個符合 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>&1if 的值a是 digit 3,但等於 iffoo >myfile 2>&1a值),它也具有工作的優勢myfile。它的缺點是它與 POSIX 不兼容。在符合 POSIX 的 shell 中,echo foo &>bar被解析為命令echo foo&操作符和命令>bar:列印的後台程序foo和創建或清空文件的前台程序bar

引用自:https://unix.stackexchange.com/questions/590694