2013-08-07 1 views
7

Proprio come abbiamo reindirizzare l'output da una per il blocco del ciclo in un fileReindirizzamento uscita da un blocco funzione in un file in Linux

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

Allo stesso modo in script di shell, c'è un modo per reindirizzare l'uscita da un blocco funzionale in un file, qualcosa come questo?

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

//call initialize 

In caso contrario, c'è un altro modo per ottenerlo? Si noti che la mia funzione ha molti messaggi da stampare in un log. Il reindirizzamento dell'output a un file su ogni riga comporterebbe un elevato utilizzo I/O.

risposta

5

Il modo in cui si suggeriscono in realtà è perfettamente valida. Il Bash manual dà la sintassi di dichiarazione di funzione come segue (sottolineatura mia) :

funzioni vengono dichiarate utilizzando la seguente sintassi:

name() compound-command [ redirections ]

o

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

Quindi questo sarebbe essere perfettamente valido e sostituire il contenuto di outfile con l'argomento su myfunc:

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

Oppure, da aggiungere al outfile:

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

Tuttavia, anche se si può mettere il nome del file di destinazione in una variabile e reindirizzare a che, in questo modo:

fname=outfile 

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

Penso che sia molto più chiaro fare il reindirizzamento in cui si chiama la funzione – proprio come raccomandato in altre risposte. Volevo solo precisare che il è avere il reindirizzamento come parte della dichiarazione di funzione.


E questa non è una da bash: la POSIX Shell spec permette anche redirezioni nel comando definizione di funzione.

3

è possibile utilizzare per exec per redirezione della shell non è sicuro se funzionerà per le funzioni di

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

fare il reindirizzamento quando si chiama la funzione.

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

alternativa, aprire una subshell nella funzione e reindirizzare l'output subshell:

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

grande aiuto, grazie –

+1

Sto provando a fare la stessa cosa e ho codificato la mia funzione esattamente come nella domanda originale. le istruzioni 'echo' esistono nella funzione e, dopo la parentesi di chiusura della funzione, reindirizza a stderr. Funziona, ma sono venuto a SO per verificare che questo fosse considerato ok.Qual è il ragionamento alla base del reindirizzamento quando si chiama la funzione, invece di fare in modo che la funzione esegua esso stesso? – smeep