2013-08-07 10 views
7

Umleiten Ausgang Genau wie wir Ausgabe von einem for-Schleife Block zu einervon einem Funktionsblock in eine Datei in Linux

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

ähnlich in Shell-Skript, ist es eine Möglichkeit, Ausgabe von einem Funktionsbaustein zu umleiten zu einer Datei, so etwas?

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

//call initialize 

Wenn nicht, gibt es eine andere Möglichkeit, die ich erreichen kann? Bitte beachten Sie, dass meine Funktion viele Nachrichten enthält, die in einem Protokoll gedruckt werden sollen. Die Umleitung der Ausgabe in eine Datei bei jeder Zeile würde zu einer hohen E/A-Auslastung führen.

Antwort

5

Die Art und Weise Sie vorschlagen, eigentlich perfekt gültig ist. Die Bash manual gibt die Funktionsdeklaration Syntax wie folgt (Hervorhebung von mir) :

Funktionen sind mit dieser Syntax deklariert:

name() compound-command [ redirections ]

oder

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

So würde dies sei vollkommen gültig und ersetze den Inhalt von outfile durch das Argument myfunc:

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

Aber auch wenn Sie den Namen Ihrer Zieldatei in eine Variable setzen kann und dass umgeleitet, wie folgt aus::

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

Oder, um outfile anhängen

Ich denke, es ist viel klarer, die Umleitung zu tun, wo Sie die Funktion – genau wie in anderen Antworten empfohlen aufrufen. Ich wollte nur darauf hinweisen, dass Sie die Umleitung als Teil der Funktionsdeklaration haben können.


Und das ist kein bashism: die POSIX Shell spec ermöglicht auch Umleitungen in der Funktionsdefinition Befehl.

3

Sie können für exec für Shell-Umleitung nicht sicher verwenden, wenn es

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

Sie die Umleitung für Funktionen arbeiten, wenn Sie die Funktion aufrufen.

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

Alternativ öffnen Sie eine Sub-Shell in der Funktion und leiten Sie die Subshell Ausgabe:

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

große Hilfe, danke –

+1

Ich versuche, das gleiche zu tun, und codiert meine Funktion genau wie in der ursprünglichen Frage. echo-Anweisungen existieren in der Funktion und nach der schließenden Klammer der Funktion leitet sie zu stderr um. Es funktioniert, aber ich kam zu SO, um zu bestätigen, dass dies als in Ordnung befunden wurde.Was ist der Grund für die Umleitung beim Aufruf der Funktion, anstatt die Funktion selbst auszuführen? – smeep

Verwandte Themen