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