Bash 不僅支援命令級重定向,函數定義尾端同樣可接重定向,使該函數每次被呼叫時自動套用對應的標準輸入/輸出/錯誤導向。這是一項鮮為人知但極具實用價值的特性。
function myfunc() {
echo "Hello"
} < input.txt > output.txt 2> error.log
呼叫 myfunc 時,自動從 input.txt 讀取 stdin,stdout 寫入 output.txt,stderr 寫入 error.log。
#!/bin/bash
function myfunc() {
echo "Hello World CoolShell.cn"
}
out=out1.txt
myfunc
out=out2.txt
myfunc
兩次呼叫分別輸出到 out1.txt、out2.txt。
#!/bin/bash
log=err.log
function error() {
echo "$*" >&2
}
function task1() { error "task1 failed"; }
function task2() { error "task2 failed"; }
{
task1
task2
} 2>$log
區塊 { ... } 同樣支援重定向,且不建立子 shell(( ... ) 會建立子 shell,變數修改不回傳)。
定義端重定向優先級更高,會覆蓋呼叫端的重定向:
function f() { echo hello; } > def.txt
f > call.txt
# 實際輸出寫入 def.txt,call.txt 為空
function reader() {
while read line; do echo "$line"; done
} <<EOF
hello
coolshell.cn
EOF
reader
(...) 中使用,除非刻意隔離環境。