将 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_file
和 stderr_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"
您可能还会发现 >&1
、2>&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
我写了一个 '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_file
和 stderr_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"
您可能还会发现 >&1
、2>&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