Перенаправление вывода из функционального блока в файл в Linux

Так же, как мы перенаправляем вывод из цикла for loop в файл

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

Аналогично в оболочке script существует ли способ перенаправления вывода из функционального блока в файл, что-то вроде этого?

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

//call initialize

Если нет, есть ли другой способ добиться этого? Обратите внимание: у моей функции много сообщений для печати в журнале. Перенаправление вывода в файл в каждой строке приведет к большому количеству операций ввода-вывода.

Ответ 1

То, как вы предлагаете, на самом деле совершенно правильно. Руководство по Bash дает синтаксис объявления функции следующим образом (выделено мной) 1:

Функции объявлены с использованием этого синтаксиса:

name () compound-command [ redirections ]

или же

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

Так что это было бы совершенно правильно и заменило бы содержимое outfile аргументом myfunc:

myfunc() {
    printf '%s\n' "$1"
} > outfile

Или добавить в outfile:

myappendfunc() {
    printf '%s\n' "$1"
} >> outfile

Тем не менее, даже если вы можете поместить имя вашего целевого файла в переменную и перенаправить на нее, например, так:

fname=outfile

myfunc() { printf '%s\n' "$1"; } > "$fname"

Я думаю, что гораздо яснее сделать перенаправление, где вы вызываете функцию, - так же, как рекомендуется в других ответах. Я просто хотел указать, что вы можете использовать перенаправление как часть объявления функции.


1 И это не bashism: спецификация POSIX Shell также допускает перенаправления в команде определения функции.

Ответ 2

Выполняйте перенаправление при вызове функции.

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

В качестве альтернативы откройте подоболочку в функции и перенаправьте вывод подэлемента:

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

Ответ 3

Вы можете использовать для exec для перенаправления оболочки, не уверен, что он будет работать для функций

exec > output_file
function initialize {
  ...
}
initialize