我想在目录中的所有.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。我也尝试在输出重定向中使用$$,但它形成一个具有不同名称的单独输出文件,并且原始输入内容也未合并在其中。
答案 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在标准输出上发出某些内容之前没有尝试附加到该文件,此时程序已将该文件作为输入关闭。