在我的脚本中,我希望能够根据特定条件写入文件或标准输出。我很好奇,为什么这并不在我的脚本工作:变量中带有文件描述符或文件名的Bash重定向
out=\&1
echo "bird" 1>$out
我尝试引号的不同组合,但我一直有创造,而不是将其写入到标准输出一个“& 1”文件。我能做些什么来实现我想要的工作?
在我的脚本中,我希望能够根据特定条件写入文件或标准输出。我很好奇,为什么这并不在我的脚本工作:变量中带有文件描述符或文件名的Bash重定向
out=\&1
echo "bird" 1>$out
我尝试引号的不同组合,但我一直有创造,而不是将其写入到标准输出一个“& 1”文件。我能做些什么来实现我想要的工作?
我很确定它与bash
处理命令行的顺序有关。以下作品:
export out=\&1
eval "echo bird 1>${out}"
因为变量替换评估之前发生。
试用eval
。应该通过自身的解释的$out
值来运作:
out='&1'
eval "echo \"bird\" 1>$out"
将在标准输出打印bird
(和一个文件,如果你改变out
)。
请注意,您必须小心eval字符串内的内容。请注意带有内部引号的反斜杠,并且在执行eval之前,变量$out
已取消(通过双引号引起)。
一个可能更安全的替代eval
是DUP您的目的地到使用exec
(文件描述符3在这个例子中)的一个临时文件描述:
if somecondition; then exec 3> destfile; else exec 3>&1; fi
echo bird >&3
+1,最好避免'eval'。 – 2010-11-05 01:08:58
@丹尼斯:我真的不明白,evalcliché...似乎是填补所有与bash相关的问题在stackoverflow :)再次和第一千次:'eval'是一种工具,而不是一个风险本身.. 。这就好像你必须避免Lisp,因为你可以将Lisp数据视为代码... – 2010-11-05 18:43:57
@Diego:'eval'可以是一个有用的工具。它也存在严重的潜在安全风险。如果你避开它,你不必担心这些特定的风险。通常很容易避免。尽可能采取简单安全的路线。当你使用'eval'时,确保你真的需要它,并且你正确地清理输入并采取其他必要的步骤来防止出现问题。参见[BashFAQ/048](http://mywiki.wooledge.org/BashFAQ/048)和[这个优秀的SO问题](http://stackoverflow.com/q/2571401)(赞成和反对)。另外,请注意,我说“最好避免”而不是“永远不要使用”。 – 2010-11-05 19:14:28
简释迭戈的回答。要改变标准输出的有条件地点
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手册页。
我在使用自己的脚本时遇到了问题,因为某些原因,我不得不使用全变量扩展符号,例如:'destfile =“/ some/path”; exec 3> $ {destfile}' – Eliot 2014-05-02 09:31:23
截至2015年,有可能重定向到>&${out}
。例如,
exec {out}>&1
echo "bird" 1>&${out}
您的系统是否支持out =/dev/stdout? – mob 2010-11-05 17:16:40