bash的幾種特別的I/O重定向語法

下面這幾種重定向語法都很簡單,容易記住:

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.txt2>&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一節可以得到一個很長的列表與詳細解釋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章