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의 설명 "명령 대체는 실행을 시작하기 전에 쉘에 의해 수행됩니다 xargs( xargs인수가 무엇인지 평가하는 단계로)"를 이해하지 못합니다 .

  • 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 %

관련 정보