如何将标准输出文件描述符放入变量中?

How to put stdout file descriptor in a variable?

我正在使用 echo var >> "${log_file}" 2>&1stdoutstderr 重定向到存储在 ${log_file} 中的文件路径。但是当变量为空时,我想将 stdoutstderr 发送到它们的 default/standard 位置。

例如,如果变量 ${log_file} 为空,则输出不应转到文件,而应转到 stdout。我应该如何设置 ${log_file} 变量值以使其输出到 stdout?

我尝试设置为 &1stdout 文件描述符)

if [[ -z "${log_file}" ]]; then
    log_file=&1
fi

echo var >> "${log_file}" 2>&1

但是没有用,bash 抛出了这个错误:

No such file or directory
1: command not found

你有两个基于变量值的根本不同的操作:

  1. 重定向 stderr 和 stdout 到命名文件
  2. 也不要重定向。

没有处理这种二分法的语法。我会推荐以下内容:

  1. 将您可能希望重定向其输出的命令包装在一个函数中。

    func () {
        echo var
    }
    
  2. 根据需要使用 if 语句在有或没有重定向的情况下调用该函数。

    if [ -n "$log_file" ]; then
        func >> "$log_file" 2>&1
    else
        func
    fi
    

另一种方法是有条件地定义func,将重定向直接附加到函数。

if [ -n "$log_file" ]; then
    func () {
        echo var
    } >> "$log_file" 2>&1
else
    func () { 
        echo var
    }
fi

func