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


10

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

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

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

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

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

답변:


12

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

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

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

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

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

내가 생각한 것은 아니지만 흥미로운 대안입니다.
Zaid

이 답변에 어떤 문제가 있습니까?
Chris

정말 멋지다! 새로운 변수를 정의하지 않는 방법이 있습니까?
사용자

@ user, 대안을 추가했습니다.
maxschlepzig


2

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

이 이름을 사용하여 이름이 "enums"인 디렉토리에 포함 된 모든 파일 목록을 가져옵니다. find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
Matt Lachman

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.