나는 다음과 같은 별칭을 정의했습니다.
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)