Bash 脚本 - 标准输出文件描述符?

Bash script - stdout file descriptor?

我的脚本中有以下内容:

OUTFILE=./output.log
echo "foo" >> ${OUTFILE}

OUTFILE 是实际文件路径时,它工作得很好。但是,有时我想通过修改 OUTFILE 来查看 stdout 上的输出,但它不起作用。我尝试使用 1&1,包括引号和不引号,并将其留空。
它一直告诉我这个:

./foo.sh: line 2: ${OUTFILE}: ambiguous redirect

我猜你想做其中之一

打印到文件

OUTFILE=./output.log
echo "foo" >> "${OUTFILE}"

打印到标准输出

OUTFILE=/dev/stdout
echo "foo" >> "${OUTFILE}"

或者只是

echo "foo"

打印到文件和标准输出

OUTFILE=./output.log
echo "foo" | tee  "${OUTFILE}"

使用 /dev/stdout 作为文件名。 (参见Portability of “> /dev/stdout”。)

由于解析顺序问题,您不能在变量中使用 &1。在执行 变量扩展之前搜索重定向标记以查找 。所以当你使用:

$ o='&1'
$ echo >$o

shell 扫描重定向运算符并看到 > 重定向运算符而不是 >& 运算符。 (并且无论如何都没有 >>& 运算符开始,因此您的附加示例无论如何都不会工作。尽管 bash 的较新版本确实有一个 &>> 运算符 >> file 2>&1 使用。)