20

Just like we redirect output from a for loop block to a file

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

Similarly in shell script, is there a way to redirect output from a function block to a file, something like this?

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

//call initialize

If not, is there some other way I can achieve that? Please note my function has lot of messages to be printed in a log. Redirecting output to a file at every line would result in a lot of I/O utilization.

4

4 回答 4

14

调用函数时进行重定向。

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

或者,在函数中打开一个子 shell 并重定向子 shell 输出:

#!/bin/bash
initialize() {
  (  # opening the subshell
    echo 'initializing'
    ...
  # closing and redirecting the subshell
  ) >> your_file.log
}
# call the function normally
initialize
于 2013-08-07T06:53:25.530 回答
14

您建议的方式实际上是完全有效的。Bash 手册给出的函数声明语法如下(强调我的)1

使用以下语法声明函数:

name ()复合命令[重定向]

或者

函数[()]复合命令[重定向]

所以这将是完全有效的,并将 的内容替换为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 规范还允许在函数定义命令中进行重定向。

于 2016-12-27T06:19:13.673 回答
3

您可以使用 forexec进行 shell 重定向,不确定它是否适用于函数

exec > output_file
function initialize {
  ...
}
initialize
于 2013-08-07T05:23:45.460 回答
0

我的解决方案是包装函数。

init_internal(){
  echo "this is init_internal with params: $@"
  echo "arg1 $1"
  echo "arg2 $2"
}

init() {
  local LOG_PATH=$1
  echo "LOG at: $LOG_PATH"
  init_internal "${@:2}" > ./$LOG_PATH 2>&1
}

init log.log a b c d

cat ./log.log

它输出:

LOG at: log.log
this is init_internal with params: a b c d
arg1 a
arg2 b
于 2020-06-12T07:07:01.413 回答