[unix] 한 줄로 여러 명령에 인수 전달

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

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

내 직감은 파일 이름 인수를 한 번만 제공하고 동시에 두 명령으로 xargs또는 이와 비슷한 것을 파이프하는 방법이 있어야한다고 말합니다 .

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

이것을 시도하면 첫 번째 명령 만 실행됩니다. 내가 원하는 것을 어떻게 달성 할 수 있습니까?



답변

이를 위해 로컬 변수를 정의 할 수 있습니다.

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

또한, 모든 무조건 (대체 할 수 &&;) 또는 병렬 (교체 &&하여 &).

또는 쉘 히스토리 확장을 사용하여 이전 인수를 참조 할 수도 있습니다.

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


답변

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

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


답변

xargs를 사용하여 다음과 같은 명령 행을 구성 할 수 있습니다.

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

위를 bash로 파이프하여 실행하십시오.

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

예제를 현재 디렉토리의 모든 * .c 파일로 확장 ( 쉘 별명 대체를 방지하기 위해 ls를 이스케이프 처리 ) :

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


답변

나는 이것을 직접 투표하지 않을 것이다. 어리 석고 위험하지만이를 수행하는 방법을 나열하기 위해 다음과 같은 것이 있습니다.

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


답변