별칭의 두 번째 명령에 파이프된 입력을 어떻게 전달할 수 있나요?

별칭의 두 번째 명령에 파이프된 입력을 어떻게 전달할 수 있나요?

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

alias xyz='command1; command2'

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

pqr | xyz -f -

가능합니까? 어떻게 해야 하나요?

답변1

별칭을 사용하는 것은 일반적으로아니요비대화형 쉘 스크립팅에 대한 모범 사례(배쉬FAQ/080). OP에서 별칭을 정의한 방식으로 첫 번째 명령만 stdin에서 읽습니다. 왜냐하면 ;첫 번째 명령 이후에 stdin이 종료되기 때문입니다.

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

alias xyz='{ command1; command2; }'

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

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

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

xyz() {
    command1; command2
}

쉘이 프로세스 bash대체를 지원하는 경우 stdin의 내용을 위치 인수로 수신하도록 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)

관련 정보