Перенаправление вывода из функционального блока в файл в 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