下面這幾種重定向語法都很簡單,容易記住:
ls > stdout.tx # 用標準輸出覆蓋stdout.txt
ls not-exist-file 2> stderr.txt # 用標準錯誤覆蓋stderr.txt
ls exist-file not-exist-file > stdout.txt 2> stderr.txt # 用標準輸出覆蓋stdout.txt,用標準錯誤覆蓋stderr.txt
cat < stdin.txt # 將stdin.txt的內容作爲標準輸入
# 這行與cat stdin.txt的效果實際是一樣的
echo "1 2 3" | awk '{print NF}' # 將echo的標準輸出重定向爲awk的標準輸入
但是也有一些特別但又偶爾會用到的語法,不經常用容易忘記,在此記錄一下。
將標準輸出和標準錯誤重定向到同一個文件
ls exist-file not-exist-file >stdout.txt 2>&1
需要注意>stdout.txt
和2>&1
的順序不能顛倒。
也有一種更簡單的語法:
ls exist-file not-exist-file &>stdout.txt
將標準輸出和標準錯誤重定向爲另一個程序的標準輸入
ls exist-file not-exist-file 2>&1 | awk '{print NF}'
將標準錯誤重定向爲另一個程序的標準輸入,丟棄標準輸出
ls exist-file not-exist-file 2>&1 >/dev/null | awk '{print NF}'
需要注意2>&1
和>/dev/null
順序不能顛倒。
重定向以另一條命令爲參數的命令的標準輸出或標準錯誤
這條聽着很拗口,主要指的是time
/strace
這些命令,如果你直接這樣寫:
time ls > stdout.txt
那被重定向到stdout.txt的是ls
的標準輸出而不是time
的標準輸出。想要重定向time
的輸出,你得這樣:
(time ls) 2> stdout.txt # time輸出是輸出到stderr的,所以此處用的是2>
Here-document
cat > stdout.txt << EOF
line 0
line 1
line 2
EOF
上面的代碼會把“line 0”、“line 1”和“line 2”總共3行文本保存到stdout.txt中(不包括最後的“EOF”)。我第一次見到這種用法是在lfs的文檔裏,其效果是cat
會將後續的輸入文本作爲標準輸入處理,直到遇到一行只包含“EOF”的輸入爲止。EOF可以替換成其他文本。
使用一連串的echo "line x" >>
實際也能達到相同的效果,但是不如這種方式清晰,命令和輸入能夠分離。
至於其他的重定向語法,還有很多,因爲我沒有用過,就不在這裏列舉了,直接man bash
然後轉到REDIRECTION
一節可以得到一個很長的列表與詳細解釋。