Bash

什麼時候順序在重定向中很重要?

  • June 19, 2021

我編寫了一個腳本,它printf "..." 1>&2在函式內部有一些註銷。執行該腳本(build.sh),我注意到如果我想將 stderr 重定向到 stdout 並將 stdout 重定向到文件

$$ 0 $$,成功取決於順序:

  • ./build.sh 2> /tmp/log.txt有效(顯然)
  • ./build.sh 1>/tmp/log.txt 2>&1作品
  • ./build.sh 2>&1 1>/tmp/log.txt不重定向到文件

並與echo

  • echo "test" 2>&1 >/tmp/log.txt作品
  • echo "test" >/tmp/log.txt 2>&1作品

這在 bash、zsh 中被複製,最初在 mksh 中報告。

命令中重定向語句的順序何時重要?謝謝!

0:不知道我為什麼要這樣做,但是腳本的使用者嘗試了它並且在重定向失敗時感到困惑。

順序很重要,因為重定向是按照它們從左到右列出的順序執行的。在您的第二個範例(正確)./build.sh 1>/tmp/log.txt 2>&1中,它首先將 fd“1”映射到一個文件,然後將“1”複製為“2”,並使用此映射執行建構腳本。在第三個範例(不工作)中,它首先將目前的“1”複製為“2”,然後才將“1”映射到文件。目前的“1”不是複制時的文件。它是您的終端或 CI shell 腳本輸出抓取器。

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