2017-04-21 1 views
1

次のように考えてください。MakeMakefileに 'awk'の列番号が 'parallel'で使用されています。

output.txt: input-*.txt 
    parallel -j 16 'echo {} | awk "{print $$0}"' ::: $^ 

問題は、awkで列番号(またはドル変数)を指定することにあります。 awkコマンドがMakefileにある場合(つまり、パラレルに供給されていない場合)、動作しますが、パラレルへの引数として使用された場合、awkコマンドは機能しません。

次のバリエーションはいずれも機能しません。

parallel -j 16 'echo {} | awk "{print \$0}"' ::: $^ 

問題を解決するのに手伝ってもらえますか?

答えて

1

バックスラッシュや引用符は気にしません。気にする唯一のキャラクター(レシピ内)は$です。それをエスケープする唯一の方法は、それを倍増することです:$$$$0を使用しても動作しない場合、問題はmakeではなく、シェルおよび/またはパラレルにあります。

あなたがすべきことは、シェルプロンプトでコマンドを実行し、必要なエスケープがあればそれを動作させることです。makeを気にする必要はありません。

シェルプロンプトでルールを適切にエスケープしたら、それをカットしてメークファイルレシピに貼り付け、$の文字をすべて$$に置き換えると動作します。

パラレルのマニュアルページを見ると、使用しているコマンドがインラインスクリプトにならないようで、バージョンが正しく動作しない可能性があります。明らかに実際のコマンドでなければなりません。代わりに/bin/sh -c "echo ..."を使用した場合はうまくいくでしょうか?

関連する問題