将 stdout 和 stderr 重定向到 bash 脚本中的变量

Redirecting stdout and stderr to variable within bash script

我写了一个 'generic' bash 脚本 (= generic_script.sh) 它作为一个包装器来启动一个实际的 bash 脚本 (= actual_script.sh), 取决于给定的参数。 generic_script 和 actual_script 的标准输出都应该写入特定的 file/folder。 generic_script 和 actual_script.

的标准错误也是如此

这两个文件(stdout 和 stderr)的写入路径取决于在脚本中解析的参数。这是一个简化的调用:

# wrapper-script     job-id job-script                args
./generic_wrapper.sh JOB001 /path/to/actual_script.sh arg1 arg2

generic_wrapper.sh:

#!/bin/bash
{
    # Guarding clauses
    ...

    # Parsing arguments
    stdout_file="/some/path//timestamp.stdout"         # Creating job-id specific folders
    stderr_file="/some/path//timestamp.stderr"

    # Sourcing actual_script.sh
    source "${path}/" 1>"${stdout_file} 2>"${stderr_file}"

    # Statistics
    ...

} > "${stdout_file}" 2>"{$stderr_file}" # throws error
echo "${stdout_file}" # returns correct file path

actual_script.sh

#!/bin/bash
echo "Just an example."

但是,执行这段代码returns /wrappers/generic_at_wrapper.sh: line 108: : No such file or directory 出错。这强烈暗示,在重定向时,变量 stdout_file 尚未填充。我认为这与解析变量或解释 bash 的顺序有关。

如果我在下一行 echo 所述变量的值 stdout_file(以及 stderr_file),我将得到正确的值,这意味着这与{} > 结构。重定向方法来自这个SO-Question.

如何将 stdout 和 stderr 重定向到存储在变量中的文件路径?文件路径变量本身是在 {} 构造中计算的,并且在关闭括号后似乎不可用。

{} > ... 构造在 > ... 之后尝试 运行 {} 中的代码。 Bash 需要在 运行 命令之前知道输出重定向。 您是否尝试在要重定向输出的代码之前设置 stdout_filestderr_file

也就是说,你的代码应该是:

stdout_file="/some/path//timestamp.stdout"         # Creating job-id specific folders
stderr_file="/some/path//timestamp.stderr"
{
   # ...content subject to redirections here...
} >"$stdout_file" 2>"$stderr_file"

您可能还会发现 >&12>&2 比传入文件夹更有用。

如果您想重定向整个代码,而不是使用块,请使用 exec 命令。即:

stdout_file="/some/path//timestamp.stdout"         # Creating job-id specific folders
stderr_file="/some/path//timestamp.stderr"
exec >"$stdout_file" 2>"$stderr_file"

# ...all code below this point has stdout going to stdout_file, and stderr to stderr_file