Bash
什麼時候順序在重定向中很重要?
我編寫了一個腳本,它
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 腳本輸出抓取器。