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