在变量中使用文件描述符或文件名重定向

时间:2010-11-04 23:56:08

标签: bash redirect file-descriptor

在我的脚本中,我希望能够根据特定条件写入文件或stdout。我很好奇为什么这在我的脚本中不起作用:

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

我尝试了不同的引号组合,但我继续创建“& 1”文件,而不是写入stdout。我该怎么做才能让我的工作变得如此?

5 个答案:

答案 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被取代(通过双引号)。