11

在我的脚本中,我希望能够根据某些条件写入文件或标准输出。我很好奇为什么这在我的脚本中不起作用:

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

我尝试了不同的引号组合,但我一直创建一个“&1”文件,而不是写入标准输出。我该怎么做才能让它按我的意愿工作?

4

5 回答 5

5

一个可能更安全的替代方法是使用(在本例中为文件描述符 3)eval将目标复制到临时文件描述符中:exec

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

echo bird >&3
于 2010-11-05T00:09:07.983 回答
3

自 2015 年起,可以重定向到>&${out}. 例如,

exec {out}>&1
echo "bird" 1>&${out}
于 2015-04-01T15:54:42.983 回答
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 编程被认为是有害的 - 查看更多重定向技巧。或者阅读 bash 手册页。

于 2010-11-05T18:58:09.677 回答
1

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

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

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

于 2010-11-05T00:01:08.810 回答
0

尝试使用eval. 它应该通过解释$out自身的价值来工作:

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

bird在标准输出上打印(如果您更改,也会打印到文件中out)。

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

于 2010-11-05T00:01:37.420 回答