별칭의 두 번째 명령에 파이프된 입력을 어떻게 전달합니까?

별칭의 두 번째 명령에 파이프된 입력을 어떻게 전달합니까?

다음과 같은 별칭을 정의했습니다.

alias xyz='command1; command2'

다음과 같이 다른 명령 pqr의 출력을 command2로 파이프하고 싶습니다.

pqr | xyz -f -

가능합니까? 어떻게 이를 달성할 수 있나요?

답변1

별칭을 사용하는 것은 일반적으로~ 아니다비대화형 쉘 스크립트의 모범 사례(배쉬FAQ/080). OP에 별칭을 정의하는 방식은 첫 ;번째 명령을 넘어서는 표준 입력을 종료하기 때문에 첫 번째 명령만 표준 입력에서 읽습니다.

한 가지 가능한 방법은 을 사용하여 명령 그룹화를 수행하여 {..}모든 리디렉션이 그룹 내의 전체 명령 집합에 적용되도록 하는 것입니다. 여전히 alias정의를 유지하고 다음을 수행 할 수 있습니다.

alias xyz='{ command1; command2; }'

이 경우 comamnd1불필요하게 표준 입력의 복사본을 얻습니다. 다음을 수행하여 닫을 수 있습니다.

alias xyz='{ command1 < /dev/null ; command2 - ; }'

또는 함수를 사용하여 명령을 정의하세요.

xyz() {
    command1; command2
}

쉘이 프로세스 대체를 지원하거나 지원하는 경우 bashstdin 컨텐츠를 위치 인수로 수신하도록 zsh정의할 수 있습니다 . command2기능을 다음과 같이 다시 정의하십시오.

xyz() {
    command1
    command2 "$@"
}

그런 다음 명령 ( pqr)을 다음과 같이 호출하십시오.

xyz < <(pqr)

위의 내용을 간단하게 설명하면,

zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food)                     #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood

답변2

xargs 접근 방식을 시도해 보시기 바랍니다. 즉, 다음과 같습니다.

alias xyz='command1; command2 | xargs pqr'

이는 입력 인수로 pqr실행 하는 것과 동일합니다.command2

답변3

command2명령 목록의 표준 입력에 무언가를 전달하려면

command1; command2

command1표준 입력에서 읽히지 않는지 확인해야 합니다 . 이는 표준 입력을 /dev/null다음 으로 리디렉션하여 수행할 수 있습니다 command1.

command1 </dev/null; command2

별칭이 남습니다.

alias xyz='command1 </dev/null; command2`

당신은 어느 것~ 아니다통화할 수 있다

pqr | xyz -f -

그것은 다음과 같습니다.

pqr | command1 </dev/null; command2 -f -

이는 다음과 같습니다

pqr | command1 </dev/null
command2 -f -

대신 xyz쉘 함수로 정의하십시오.

xyz () {
    command1 </dev/null
    command2 "$@"
}

여기서는 command2함수의 표준 입력과 함수에 제공된 명령줄 인수를 모두 가져옵니다.

이제 파이프라인에서와 같이 이를 사용할 수 있습니다 pqr | xyz -f -.

-f -전달하는 인수가 "표준 입력에서 읽기"( 표준 입력을 나타냄) command2라고 말하는 경우에만 쉘이 지원하는 경우 프로세스 대체를 에 전달할 수 있습니다.--xyz

xyz -f <(pqr)

위의 기능을 사용하면 다음과 같습니다.

command1 </dev/null
command2 -f <(pqr)

관련 정보