如何解决这种模糊的重定向错误

时间:2016-11-16 14:35:54

标签: linux bash cmd

我想在目录中的所有.fa文件中运行程序(锚点),并将输出追加到输入文件中(作为原始输入内容的下一行)。为此,我尝试过:

for f in ./*.fa ; do ./anchor $f -d ./; done >> $f

它给出了错误:

bash: $f: ambiguous redirect

我理解bash反对在输入文件中发布输出内容,但是因为我最近从windows系统迁移,所以我这样做:

for %F in ("*.fa") do anchor %F -d ./ >> %%F

给了我想要的输出。

虽然在输入文件中附加输出似乎很奇怪,但是如何在shell中执行此操作?

由于

PS。我也尝试在输出重定向中使用$$,但它形成一个具有不同名称的单独输出文件,并且原始输入内容也未合并在其中。

1 个答案:

答案 0 :(得分:4)

最合乎逻辑的方法是从循环内部重定向,而不是直接重定向(感谢123的评论:文件不能同时输入和输出,也许在这里它可以工作,因为Windows循环似乎工作,但不要冒无用的风险......)

for f in ./*.fa ; do ./anchor $f -d ./ > /tmp/something; cat /tmp/something >> $f; done 
BTW:我不敢尝试解释原始代码的作用,f定义/评估$f时(进入for循环之前或之后)

我的猜测是$f只是评估并被视为$f字面意思,这会让bash感到困惑。

无论如何,这是不正确的。

编辑:Windows版

for %F in ("*.fa") do anchor %F -d ./ >> %%F

重定向循环中(与你的unix尝试不同),并且由于windows文件锁定而真的令人惊讶,因为windows文件锁定...

可能发生的事情(不确定)是Windows在标准输出上发出某些内容之前没有尝试附加到该文件,此时程序已将该文件作为输入关闭。