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

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

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

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

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

//call initialize

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

3 ответов


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

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

name () compound-command [ redirections ]

или

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

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

myfunc () {
    echo ""
} > outfile

или, чтобы добавить к outfile:

myappendfunc () {
    echo ""
} >> outfile

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

fname=outfile

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

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


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


сделать перенаправление при вызове функции.

#!/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

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

exec > output_file
function initialize {
  ...
}
initialize