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