在我的脚本中,我希望能够根据特定条件写入文件或stdout。我很好奇为什么这在我的脚本中不起作用:
out=\&1
echo "bird" 1>$out
我尝试了不同的引号组合,但我继续创建一个“&1”文件,而不是写入stdout。我该怎么做才能让我的工作方式如何?
在我的脚本中,我希望能够根据特定条件写入文件或stdout。我很好奇为什么这在我的脚本中不起作用:
out=\&1
echo "bird" 1>$out
我尝试了不同的引号组合,但我继续创建一个“&1”文件,而不是写入stdout。我该怎么做才能让我的工作方式如何?
一个可能更安全的替代品 eval
是使用将目标复制到临时文件描述符中 exec
(本例中的文件描述符3):
if somecondition; then exec 3> destfile; else exec 3>&1; fi
echo bird >&3
阐述迭戈的答案。改变stdout有条件的地方
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手册页。
截至2015年,可以重定向到 >&${out}
。例如。,
exec {out}>&1
echo "bird" 1>&${out}
我很确定它与订单有关 bash
处理命令行。以下作品:
export out=\&1
eval "echo bird 1>${out}"
因为变量替换发生了 之前 评价。
试试吧 eval
。它应该通过解释的价值来工作 $out
本身:
out='&1'
eval "echo \"bird\" 1>$out"
会打印 bird
在标准输出上(如果更改,则为文件) out
)。
请注意,您必须小心eval字符串中的内容。注意带有内部引号的反斜杠,以及变量 $out
在执行eval之前,它被取代(通过双引号)。