
다음과 같은 별칭을 정의했습니다.
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
}
쉘이 프로세스 대체를 지원하거나 지원하는 경우 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)