2013-08-07 42 views
7

就像我們從一個for循環塊輸出重定向到文件重定向從一個功能塊的輸出到一個文件在Linux中

for() 
do 
    //do something 
    //print logs 
done >> output file 

同樣,在shell腳本,有沒有辦法來重定向從一個功能塊的輸出到一個文件,像這樣的東西?

function initialize { 
     //do something 
     //print something 
} >> output file 

//call initialize 

如果不是,有沒有其他方法可以實現這一目標?請注意我的功能有很多消息要打印在日誌中。將輸出重定向到每行的文件會導致大量的I/O利用率。

回答

5

你建議的方式其實是完全有效的。該Bash manual給出了函數聲明語法如下(重點煤礦):

功能都採用這種語法聲明:

name() compound-command [ redirections ]

function name [()] compound-command [ redirections ]

所以這會完全有效並將outfile的內容替換爲的參數:

​​

或者,追加到outfile

myappendfunc() { 
    echo "$1" 
} >> outfile 

但是,即使你可以把你的目標文件的名稱到一個變量,然後重定向到的是,像這樣的:

fname=outfile 

myfunc() { echo "$1"; } > "$fname" 

我想認爲這是更清楚這樣做,你叫就像在其他的答案中建議的功能–重定向。我只想指出,你可以將作爲函數聲明的一部分進行重定向。


這是不是一個bashism:所述POSIX Shell spec還允許重定向在函數定義命令。

3

您可以使用exec殼重定向不知道它是否會爲功能

exec > output_file 
function initialize { 
    ... 
} 
initialize 
9

執行重定向當你調用該函數工作。

#!/bin/bash 
initialize() { 
    echo 'initializing' 
    ... 
} 
#call the function with the redirection you want 
initialize >> your_file.log 

或者,可打開該功能的子shell和重定向子shell輸出:

#!/bin/bash 
initialize() { 
    ( # opening the subshell 
    echo 'initializing' 
    ... 
    # closing and redirecting the subshell 
) >> your_file.log 
} 
# call the function normally 
initialize 
+0

很大的幫助,感謝 –

+1

我試圖做同樣的事情,和我的編碼功能酷似原來的問題。 'echo'語句存在於函數中,並且在函數的大括號之後它重定向到stderr。它的工作原理,但我來到SO來驗證這被認爲是可以做的。調用函數時重定向背後的原因是什麼,而不是讓函數本身執行它? – smeep

相關問題