Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Shell 重導向深度解析:為什麼要寫 2>&1 以及順序的重要性

編輯:Linux 教學

腳本與 crontab 中常見 >/dev/null 2>&1,後半段 2>&1 究竟在做什麼?為何順序不能顛倒?本文從檔案描述符原理切入,配合實測說明。

一、三個標準檔案描述符

代號名稱預設指向
0stdin(標準輸入)鍵盤/終端
1stdout(標準輸出)螢幕/終端
2stderr(標準錯誤)螢幕/終端

二、2>&1 的含義

2>&1 將檔案描述符 2(stderr)複製導向至檔案描述符 1(stdout)目前所指向的目標。

三、順序差異實測

測試腳本 t.sh:

#!/usr/bin/zsh
tttttt      # 不存在的指令,產生 stderr
echo "test" # 正常輸出 stdout
指令結果說明
./t.sh >/dev/null 2>&1stdout → /dev/null,stderr 複製 stdout 也 → /dev/null (全靜默)
./t.sh 2>&1 >/dev/nullstderr 複製 stdout(目前指向終端),再將 stdout → /dev/null (stderr 仍輸出終端)

四、實際輸出對照

$ ./t.sh
./t.sh:2: command not found: tttttt
test

$ ./t.sh >/dev/null
./t.sh:2: command not found: tttttt

$ ./t.sh >/dev/null 2>&1
(無輸出)

$ ./t.sh 2>&1 >/dev/null
./t.sh:2: command not found: tttttt
test

五、核心結論

  1. 重導向順序即執行順序:Shell 從左至右依序處理。
  2. >file 2>&1 先綁定 stdout,stderr 再跟隨。
  3. 2>&1 >file 先綁定 stderr 到舊 stdout,stdout 才改向 file,stderr 不受影響。

記住:「先導標準輸出,再合併標準錯誤」才能達到雙重導向靜默的效果。

Copyright © Windows教程網 All Rights Reserved