realpath --relative-toがコマンドオーバーライドで機能しないのはなぜですか?

realpath --relative-toがコマンドオーバーライドで機能しないのはなぜですか?
user@debian:~/test/B$ find ..
..
../A
../A/x
../A/y
../A/z
../B
user@debian:~/test/B$ find ../A -type f -print0 |xargs -0 -i% realpath --relative-to=../A %
x
y
z
user@debian:~/test/B$ # But
user@debian:~/test/B$ find ../A -type f -print0 |xargs -0 -i% echo $(realpath --relative-to=../A %)
../B/../A/x
../B/../A/y
../B/../A/z

ムルは「という質問に対する答えを提案します。basenameで-execコマンドオプションを見つける「おそらく質問に答えます。しかし、私はfindwithを使用しません-exec

realpath私はmuruの説明「コマンドの置き換えは実行を開始する前にシェルによって実行されますxargsxargs引数が何であるかを評価するステップとして)」を理解していません。

  • realpath --relative-to=../A電話する前にどのように評価しますかxargs
  • 評価をしてもその評価結果は何であり、なぜ他の出力が出るのでしょうか?

答え1

説明する

私の答えを案内してくれた@muruに感謝します。現在の状況は次のとおりです。

シェルがコマンドラインを表示するとき

find ../A -type f -print0 |xargs -0 -i% echo $(realpath --relative-to=../A %)

まず、コマンド置換を評価します。

realpath --relative-to=../A %

評価結果はです../B/%

したがって、起動時に実行する有効なコマンドは次のとおりfindです。

find ../A -type f -print0 |xargs -0 -i% echo ../B/%

realpath...まったく呼び出さずにfind出力を../B/

解決策

そこでコマンド置換を使用しないでください。realpath目的のタスクを実行する前に、通常を使用してそのタスクを実行します(この例ではあまりありませんが、明らかに拡張できます)。

find ../A -type f -print0 |xargs -0 -i% realpath -z --relative-to=../A % |xargs -0 -i% echo %

関連情報