답변:
bash에서는 괄호를 사용할 수 있습니다.
(A && B || C) | D
이 방법으로의 출력 A && B || C이로 파이프됩니다 D.
sh:)
A서브 쉘 안에 있으므로 A
이것을 다음과 같이 쓸 수 있습니다
if A; then B; else C; fi | D
당신은 당신이 중 하나를 실행하고 싶은 말은 B나 C,하지만 A && B || C그것을 달성하지 않습니다. 경우 A, 그러나 성공 B실행 및 실패, 그것을 실행하는 것입니다 C.
참고 1 : B항상 성공하고 짧은 버전을 고수 한다고 보장 할 수 있다면 여전히 선택합니다.
{ A && B || C; } | D
이상 ( ... ), 또는 멀리 최적화되지 않을 수도 있습니다 새로운 서브 쉘이 생성 될 수있는 후자 불필요하게 힘으로.
참고 2 : 두 형식 모두 A출력을 생성하지 않는다고 가정 합니다. 이는 예제에서는 사실이지만 반드시 그렇지는 않습니다. 그것은 피할 수 있습니다
A; if [ "$?" -eq 0 ]; then B; else C; fi | D
{ … }파이프로 인해 생성 될 수있는 서브 쉘을 강제하지 않는 이유는 무엇입니까? 나는 다음과 같은 행동을 관찰 : pgrep bash및 pgrep bash | cat및 if true; then pgrep bash; fi및 { pgrep bash; }출력의 한 줄이있다; ( pgrep bash; )및 ( pgrep bash; ) | cat및 { pgrep bash; } | cat와 if true; then pgrep bash; fi | cat출력의 두 라인을 갖는다.
... | ...은 피할 수없는 서브 쉘을 생성합니다. ( ... )적어도 이론 상으로는 피할 수 있는 추가 서브 쉘이 만들어 { ...; }지지만 이것이 바로 "최적화되거나 최적화되지 않을 수 있습니다"라는 의미입니다. 효과는 동일합니다.
수락 자 답변은 정확하지만 의 입력으로 출력을 갖지 않는 잠재적 사용 사례를 다루지 않습니다 . 이를 위해서는 필요에 따라 스트림 리디렉션이 필요 합니다.ADA
A어쨌든 출력을 삭제하려면 다음을 수행하십시오.
{ A >/dev/null && B || C; } | DA터미널 에서 출력을 보려면 :
{ A >/dev/tty && B || C; } | DA후속 명령의 입력으로 의 출력 E이 필요한 경우 추가 명령 그룹과 스트림 리디렉션이 필요합니다.
{ { A >&3 && B || C; } | D; } 3>&1 | E이 모든 것이 당신에게 너무 이상하게 보일 경우 (나처럼) 종료 상태에 특수 쉘 변수를 사용하고 그 작업을 수행하는 것이 좋습니다 A.
A
if [ $? -eq 0 ]; then
B
else
C
fi |
D
더 간결하고 싶지만 너무 간결하지 않으려면 다음과 같이 제안하십시오.
A; { [ $? -eq 0 ] && B || C; } | D
( 원래 답변을 쓸 때 눈치 채지 못한 hvd의 답변 의 마지막 부분도 참조하십시오 .)
A파이프 라인에서 단순히 나간 "참고 2 :"에 무엇을 넣었는지보십시오 .
A && (B || C) | DA가 실패 할 때 B, C 또는 D를 실행하지 않으려면