2016-11-16 17 views
2

ディレクトリ内のすべての.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 

これは私に望ましい出力を与えます。

これは入力ファイルに出力を追加するのが奇妙に思えるかもしれませんが、どのようにシェルで行うことができますか?

ありがとう

ps出力リダイレクトでも$$を使用しようとしますが、別の名前の別の出力ファイルを作成し、元の入力内容もそのファイルにマージされません。

+0

'f'は' for'文のローカルなので、あなたは何もせずに 'do'セクションに入れます。 – 123

+1

'f'はローカルではありません。ループの後に最後に割り当てられた値が保持されます。 – chepner

+1

違いは、 '$ f'が空の文字列に展開される可能性があるときに、'> $ f'がループが実行される前に処理されることです。 – chepner

答えて

4

これを行う最も論理的な方法は、代わりにループ内から直接リダイレクトすることです(コメントは123です。 BTW)...

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

を動作しますが、のは無用なリスクを取らないようにする:$fは(前または入力した後に評価されたとき、私はあなたの元のコードが何をするのか説明しようとあえてしないだろう、f /定義されていますforループ)。

私の推測では、$fがちょうどないbashを混乱させる文字通り$f、として評価、検討ということです。

これは間違いです。

EDIT:Windows版

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

は(あなたのUNIXの試みとは異なり)リダイレクト内部ループを実行し、そしてそれは、それが原因で、Windowsのファイルロックの動作することは本当に驚きだ...

何が起こる可能性があるのか​​(わからない)というのは、何かが標準出力で発行される前にウィンドウにファイルを追加しようとしないということです。その時点で、プログラムは入力としてファイルを閉じました。

+0

が動作しません。入力ファイルを出力できません。 – 123

+0

@ 123私は何を考えていたのですか?アンカーが何をしているかによってプログラムが完全に読み込まれた後、それを出力します(しかし、どんな速度でも危険です)。編集されました。 –

+0

ええ、私はそれが動作するかもしれないが追加されていることを投稿した後に実現しましたが、あなたは答えを削除しました。 – 123