Die Art und Weise, wie Sie vorschlagen, ist eigentlich vollkommen gültig. Das Bash-Handbuch gibt die Funktionsdeklarationssyntax wie folgt an (Hervorhebung von mir):
Funktionen werden mit dieser Syntax deklariert:
name () compound-command [ redirections ]
oder
function name [()] compound-command [ redirections ]
Dies wäre also vollkommen gültig und würde den Inhalt von outfile
ersetzen mit dem Argument zu myfunc
:
myfunc() {
printf '%s\n' "$1"
} > outfile
Oder zum Anhängen an outfile
:
myappendfunc() {
printf '%s\n' "$1"
} >> outfile
Allerdings können Sie den Namen Ihrer Zieldatei wie folgt in eine Variable einfügen und dorthin umleiten:
fname=outfile
myfunc() { printf '%s\n' "$1"; } > "$fname"
Ich denke, es ist viel klarer, die Umleitung dort durchzuführen, wo Sie die Funktion aufrufen – genau wie in anderen Antworten empfohlen. Ich wollte nur darauf hinweisen, dass Sie können haben die Umleitung als Teil der Funktionsdeklaration.
Und das ist kein Bashismus:Die POSIX-Shell-Spezifikation erlaubt auch Umleitungen im Funktionsdefinitionsbefehl.
Führen Sie die Umleitung durch, wenn Sie die Funktion aufrufen.
#!/bin/bash
initialize() {
echo 'initializing'
...
}
#call the function with the redirection you want
initialize >> your_file.log
Öffnen Sie alternativ eine Subshell in der Funktion und leiten Sie die Ausgabe der Subshell um:
#!/bin/bash
initialize() {
( # opening the subshell
echo 'initializing'
...
# closing and redirecting the subshell
) >> your_file.log
}
# call the function normally
initialize
Sie können für exec
verwenden für Shell-Umleitung nicht sicher, ob es für Funktionen funktioniert
exec > output_file
function initialize {
...
}
initialize