한 줄로 여러 명령에 매개변수 전달

한 줄로 여러 명령에 매개변수 전달

동일한 파일에서 한 줄로 여러 명령을 실행할 수 있기를 원합니다. 현재 제가 하는 방식은 다음과 같습니다.

commandA file && commandB file && perl -ne '...' file

xargs내 직감에 따르면 파일 이름 인수를 한 번만 제공하고 이를 유사한 방법을 통해 두 명령에 파이프하는 방법이 있어야 합니다 .

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

이것을 시도하면 첫 번째 명령만 실행됩니다. 내가 하고 싶은 일을 어떻게 이룰 수 있나요?

답변1

이를 위해 지역 변수를 정의할 수 있습니다.

f=file; commandA $f && commandB $f && ...

&&무조건( 로 대체 ;) 또는 병렬로( &&로 대체) 실행할 수도 있습니다 &.

또는 셸 기록 확장을 사용하여 이전 인수를 참조할 수 있습니다.

commandA file && commandB !:1 && ...

답변2

Bash, Korn 및 Z와 같은 프로세스 대체가 있는 셸의 경우 다음을 수행할 수 있습니다.

find file | tee >(xargs commandA) >(xargs commandB) >(xargs perl -ne '...')

답변3

xargs를 사용하여 명령줄을 작성할 수 있습니다. 예를 들면 다음과 같습니다.

echo file | xargs -i -- echo ls -l {}\; wc -l {}

위의 내용을 bash에 파이프하여 실행하세요.

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

예제를 현재 디렉터리의 모든 *.c 파일로 확장합니다(이스케이프됨).엘에스이렇게 하면 쉘 별칭 대체가 방지됩니다.

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

답변4

나는 이것에 투표하지 않을 것입니다. 이것은 어리 석고 위험하지만 이를 수행하는 방법을 나열하면 다음과 같습니다.

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

관련 정보