2010-11-04 61 views
11

在我的脚本中,我希望能够根据特定条件写入文件或标准输出。我很好奇,为什么这并不在我的脚本工作:变量中带有文件描述符或文件名的Bash重定向

out=\&1 
echo "bird" 1>$out 

我尝试引号的不同组合,但我一直有创造​​,而不是将其写入到标准输出一个“& 1”文件。我能做些什么来实现我想要的工作?

+0

您的系统是否支持out =/dev/stdout? – mob 2010-11-05 17:16:40

回答

1

我很确定它与bash处理命令行的顺序有关。以下作品:

export out=\&1 
eval "echo bird 1>${out}" 

因为变量替换评估之前发生

0

试用eval。应该通过自身的解释的$out值来运作:

out='&1' 
eval "echo \"bird\" 1>$out" 

将在标准输出打印bird(和一个文件,如果你改变out)。

请注意,您必须小心eval字符串内的内容。请注意带有内部引号的反斜杠,并且在执行eval之前,变量$out已取消(通过双引号引起)。

5

一个可能更安全的替代eval是DUP您的目的地到使用exec(文件描述符3在这个例子中)的一个临时文件描述:

if somecondition; then exec 3> destfile; else exec 3>&1; fi 

echo bird >&3 
+0

+1,最好避免'eval'。 – 2010-11-05 01:08:58

+3

@丹尼斯:我真的不明白,evalcliché...似乎是填补所有与bash相关的问题在stackoverflow :)再次和第一千次:'eval'是一种工具,而不是一个风险本身.. 。这就好像你必须避免Lisp,因为你可以将Lisp数据视为代码... – 2010-11-05 18:43:57

+1

@Diego:'eval'可以是一个有用的工具。它也存在严重的潜在安全风险。如果你避开它,你不必担心这些特定的风险。通常很容易避免。尽可能采取简单安全的路线。当你使用'eval'时,确保你真的需要它,并且你正确地清理输入并采取其他必要的步骤来防止出现问题。参见[BashFAQ/048](http://mywiki.wooledge.org/BashFAQ/048)和[这个优秀的SO问题](http://stackoverflow.com/q/2571401)(赞成和反对)。另外,请注意,我说“最好避免”而不是“永远不要使用”。 – 2010-11-05 19:14:28

2

简释迭戈的回答。要改变标准输出的有条件地点

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手册页。

+0

我在使用自己的脚本时遇到了问题,因为某些原因,我不得不使用全变量扩展符号,例如:'destfile =“/ some/path”; exec 3> $ {destfile}' – Eliot 2014-05-02 09:31:23

2

截至2015年,有可能重定向到>&${out}。例如,

exec {out}>&1 
echo "bird" 1>&${out}