Linux 如何解决这个不明确的重定向错误

Linux 如何解决这个不明确的重定向错误,linux,bash,cmd,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 ./ &g

我想在目录中的所有.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中如何才能做到这一点

谢谢


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

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

顺便说一句:我不敢解释你原来的代码是怎么做的,是定义的还是在计算时(在进入
for
循环之前或之后)

我的猜测是,
$f
只是没有按字面意思计算并被视为
$f
,这混淆了
bash

无论如何,这是不正确的

编辑:windows版本

for %F in ("*.fa") do anchor %F -d ./ >> %%F
在循环中执行重定向(与您的unix尝试不同),由于windows文件锁定,它的工作方式令人惊讶


可能发生什么(不确定)windows在标准输出上发布某些内容之前不会尝试附加到文件中,此时,程序已将文件作为输入关闭。

f
只是
for
语句的本地,您将重定向到nothing,将其放在
do
部分。
f
不是本地的;它保留最后一个循环后的赋值。不同的是,
>$f
是在循环运行之前处理的,而
$f
很可能会扩展为空字符串。@chepner,哦,是的,我的错,看起来它没有设置在
>
之前,所以尝试打开一个不存在的空值。如果在循环之前设置它,则不会产生错误。@123我在想……它可能会工作,这取决于锚定的功能:如果程序完全读取文件,然后发出输出,它可能会工作(但无论如何都会有风险).Edited。是的,在我发布后意识到它是append,所以可能有效,但你已经删除了答案。我删除了它进行编辑。奇怪的是,它适用于文件被锁定的windows(而不是Un*x),因此如果windows版本有效,这意味着我的第一个版本也可以工作(但不建议这样做,因为这取决于执行的程序)
for %F in ("*.fa") do anchor %F -d ./ >> %%F