xargs -I
サブコマンドには適用できません。
例:
# Not working
ls .... | xargs -n 1 -I % sh -c "cmd $(cmd2 % )"
# working
ls .... | xargs -n 1 -I % sh -c "cmd % "
子供の授業で代用する方法はありますか?
ベストアンサー1
問題は、シェルが二重引用符で囲まれた文字列引数でコマンド置換を拡張することです。xargs
始める前にこれは、最後の引数を評価するためにcmd2
リテラル引数を使用してシェルが実行されることを意味します。%
xargs
2番目の例のコマンドには、末尾のシェルコード引数に呼び出しシェルが開始する前に処理する必要がある拡張機能が含まれていないため、この問題はありませんxargs
。
二重引用符の代わりに一重引用符でパラメータを引用することで、最初のコマンドでこの問題を解決できます。
ls
しかし、構文解析された出力が悪い考えなのにはそれほどの理由があります。%
実行されるシェルコードにプレースホルダが含まれるため、ファイルsh -c
名に引用符、ワイルドカード文字、または拡張子(他の拡張子など)が含まれていると、実際の問題が発生します。$(...)
この場合、通常のシェルループを使用する方が安全です。
for name in ...; do cmd "$(cmd2 "$name")"; done
またはおそらくもっと読みやすくなります。
for name in ...; do
cmd "$(cmd2 "$name")"
done
......
興味のある名前と一致するパターンはどこにありますか?
また見なさい:
また、関連しています(シェルコードに含めることは%
シェルコードに含めるのとxargs
同じ問題があります):{}
find