将echo或printf输出重定向到变量,该变量表示bash脚本中的std *流

时间:2018-02-22 17:14:03

标签: bash

在perl中,我通常这样做:

...
if(exists($myLog))
{
    if( ! open($fhLog, '>>', $myLog))
    {
        print "[wrn] unable to open \"$myLog\", using stdout instead\n";
        $fhLog = *STDOUT;
    }
}
...

然后,在整个脚本中,我只使用:

print $fhLog "\n[inf] started at $rndate\n";

无论如何,知道它会转到文件或stdout

我怎样才能在bash中echo "text" > $someVar获得相同的结果?

编辑:RHEL7上的bash 4.2

1 个答案:

答案 0 :(得分:1)

假设bash 4.1或更新版本,您具有自动文件描述符验证,并且能够重定向到变量中的FD编号:

#!/usr/bin/env bash
case $BASH_VERSION in
  ""|[0-3].*|4.0*) echo "ERROR: Bash 4.1 or newer is needed" >&2; exit 1;;
esac

logFd=2 ## default to logging to stderr

# if myLog variable exists, make logFd a file descriptor number open to it
[[ $myLog ]] && exec {logFd}>"$myLog"

echo "This will go to either the file or stderr" >&$logFd

这有两个关键部分:

  • exec {variableName}>filename打开filename并将文件描述符分配给变量variableName。您可以根据需要更改重定向运算符(>><>等)。
  • >&$variableName重定向到variableName
  • 中存储的文件描述符

对于旧版本的bash,或者为了与POSIX sh兼容,您需要使用固定的FD编号:

#!/bin/sh
# here, we're using FD 3 for logging

if [ -n "$myLog" ]; then
  exec 3>"$myLog"
else
  exec 3>&2
fi

echo "This will go to either the file or stderr" >&3