在我的脚本中,我希望能够根据某些条件写入文件或标准输出。我很好奇为什么这在我的脚本中不起作用:
out=\&1
echo "bird" 1>$out
我尝试了不同的引号组合,但我一直创建一个“&1”文件,而不是写入标准输出。我该怎么做才能让它按我的意愿工作?
在我的脚本中,我希望能够根据某些条件写入文件或标准输出。我很好奇为什么这在我的脚本中不起作用:
out=\&1
echo "bird" 1>$out
我尝试了不同的引号组合,但我一直创建一个“&1”文件,而不是写入标准输出。我该怎么做才能让它按我的意愿工作?
一个可能更安全的替代方法是使用(在本例中为文件描述符 3)eval
将目标复制到临时文件描述符中:exec
if somecondition; then exec 3> destfile; else exec 3>&1; fi
echo bird >&3
自 2015 年起,可以重定向到>&${out}
. 例如,
exec {out}>&1
echo "bird" 1>&${out}
阐述迭戈的回答。有条件地更改标准输出的位置
if [ someCondition ] ; then
# all output now goes to $file
exec 1>$file
fi
echo "bird"
或者创建自己的文件描述符;
if [ someCondition ] ; then
# 3 points to stdout
exec 3>&1
else
# 3 points to a file
exec 3>$outfile
fi
echo "bird" >&3
改编自:csh 编程被认为是有害的 - 查看更多重定向技巧。或者阅读 bash 手册页。
我很确定这与bash
处理命令行的顺序有关。以下作品:
export out=\&1
eval "echo bird 1>${out}"
因为变量替换发生在评估之前。
尝试使用eval
. 它应该通过解释$out
自身的价值来工作:
out='&1'
eval "echo \"bird\" 1>$out"
将bird
在标准输出上打印(如果您更改,也会打印到文件中out
)。
请注意,您必须小心 eval 字符串中的内容。注意带有内部引号的反斜杠,并且在执行 eval 之前变量$out
被替换(通过双引号)。