파이프라인에서 명령 실행

파이프라인에서 명령 실행

다음 작업을 수행할 수 없는 이유를 이해해야 합니다.

ls -d /data/VT60000* | xargs -IDIRECTORY find DIRECTORY -type f -iname RJ\*.xml | xargs -IFILE sh -c ' XML=$( xmlstarlet fo -D "FILE" );
EXTRACT=$( xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)" <<< "$XML" );
echo '$EXTRACT'; '

수천 개의 XML 파일이 포함된 폴더가 많이 있습니다. 이 파일에서 정보를 추출한 다음 나중에 처리하기 위해 조작하고 싶습니다. 파이프하는 이유는 여러 프로세스(-P)를 실행하고 싶기 때문입니다.

두 번째 xmlstarlet이 실행되지 않고 그 이유를 이해할 수 없습니다.

문제는 이것을 어떻게 달성할 수 있느냐는 것입니다. $EXTRACT에서 값을 가져옵니다.

미리 도움을 주셔서 감사합니다.

답변1

여기서 주요 문제는 XMLfrom이라는 셸 내에서 변수를 할당 xargs하지만 기본 스크립트에서 변수를 사용하려고 한다는 것입니다. 하위 프로세스가 상위 셸에 직접 변수를 전달할 수 없기 때문에 이는 작동하지 않습니다.

대신, 값을 인쇄하거나 동일한 셸에서 사용해야 합니다.

스크립트를 보면 다음과 같은 작업을 수행하려는 것 같습니다.

xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)"

또는sh -c

sh -c 'xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('\''JD'\'',/root/item1,/root/item2)"'

하지만 인용은 좋지 않으므로 다른 스크립트나 변수(문자열만 또는 배열의 전체 항목)에 넣는 것이 좋습니다.

xmlstarlet또한 여러 번 호출되는 경우 첫 번째 줄의 출력으로 무엇을 하려는지 잘 모르겠습니다 .


ls /data/VT60000* | xargs문제가 있는 파일 이름 문제를 방지하기 위해 대체를 사용할 수 있습니다 printf "%s\0" * | xargs -0.

답변2

echo '$EXTRACT'작은따옴표(작은따옴표는 대체를 허용하지 않음)의 잘못된 사용과 잘못된 중첩된 작은따옴표(작은따옴표 내의 작은따옴표)로 인해 작동하지 않습니다. 작은따옴표 안에 큰따옴표를 넣어야 합니다. 귀하의 코드를 테스트할 수 없어서 다음과 같이 작성하고 테스트했습니다.

ls -d $HOME | \
   xargs -IDIR find "DIR" -type f -name '*\.conf' | \
   xargs -IFILE sh -c 'l=$(wc -l "FILE"); echo "$l"'

관련 정보