在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
答案 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