使用变量中的文件描述符或文件名进行 Bash 重定向

问题描述 投票:0回答:5

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

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

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

bash file-descriptor
5个回答
5
投票

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

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

echo bird >&3

3
投票

自 2015 年起,可以重定向至

>&${out}
。例如,

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

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


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
被替换(通过双引号)。

© www.soinside.com 2019 - 2024. All rights reserved.