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