파이프 B를 D로? -A && B || C | 디 DB 또는 C가 D로

A && B || C | DB 또는 C가 D로 파이프되도록 명령 구조를 다시 쓰는 방법이 있습니까?

현재 명령을 사용하면 B 만 또는 C와 D가 모두 실행됩니다.

예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오



답변

bash에서는 괄호를 사용할 수 있습니다.

(A && B || C) | D

이 방법으로의 출력 A && B || C이로 파이프됩니다 D.


답변

이것을 다음과 같이 쓸 수 있습니다

if A; then B; else C; fi | D

당신은 당신이 중 하나를 실행하고 싶은 말은 BC,하지만 A && B || C그것을 달성하지 않습니다. 경우 A, 그러나 성공 B실행 및 실패, 그것을 실행하는 것입니다 C.

참고 1 : B항상 성공하고 짧은 버전을 고수 한다고 보장 할 수 있다면 여전히 선택합니다.

{ A && B || C; } | D

이상 ( ... ), 또는 멀리 최적화되지 않을 수도 있습니다 새로운 서브 쉘이 생성 될 수있는 후자 불필요하게 힘으로.

참고 2 : 두 형식 모두 A출력을 생성하지 않는다고 가정 합니다. 이는 예제에서는 사실이지만 반드시 그렇지는 않습니다. 그것은 피할 수 있습니다

A; if [ "$?" -eq 0 ]; then B; else C; fi | D

답변

수락 자 답변은 정확하지만 의 입력으로 출력을 갖지 않는 잠재적 사용 사례를 다루지 않습니다 . 이를 위해서는 필요에 따라 스트림 리디렉션이 필요 합니다.ADA

  • A어쨌든 출력을 삭제하려면 다음을 수행하십시오.

    { A >/dev/null && B || C; } | D
  • A터미널 에서 출력을 보려면 :

    { A >/dev/tty && B || C; } | D
  • A후속 명령의 입력으로 의 출력 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의 답변 의 마지막 부분도 참조하십시오 .)