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

Mil*_*ilo 11 bash redirect file-descriptor

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

out=\&1
echo "bird" 1>$out
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的引号组合,但我继续创建一个"&1"文件,而不是写入stdout.我该怎么做才能让我的工作方式如何?

Sea*_*ean 5

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

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

echo bird >&3
Run Code Online (Sandbox Code Playgroud)

  • @Dennis:我真的无法理解eval的陈词滥调......似乎是在stackoverflow中填写所有与bash相关的问题:)再次和千分之一秒:`eval`是一个工具而不是风险本身......这就像说你必须避免使用Lisp,因为你可以将Lisp数据视为代码...... (3认同)
  • @Dennis:我同意你对"一般"eval使用的大部分看法.但是,在这种情况下,他正在控制所有代码.试图避免在我完全控制的代码中使用"eval"是没有意义的...... (2认同)
  • @Diego:当exec更干净,更容易阅读时,为什么你会在这种情况下使用eval?我相信@Dennis的观点是,在没有明确的选择时你应该只使用eval.在这种情况下有一个更好的选择. (2认同)

pax*_*blo 1

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

export out=\&1
eval "echo bird 1>${out}"
Run Code Online (Sandbox Code Playgroud)

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