B에서 D로 파이프? - A && B || 다 | 디

B에서 D로 파이프? - A && B || 다 | 디

A && B || C | DB 또는 C가 D로 연결되도록 명령 구조를 다시 작성하는 방법이 있습니까 ?

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

예를 들어:

여기에 이미지 설명을 입력하세요

답변1

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

(A && B || C) | D

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

답변2

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

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

B또는 중 하나를 실행하고 C싶지만 A && B || C달성하지 못한다고 말합니다 . A성공했지만 B실행 및 실패 하면 C.

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

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

over ( ... ), 후자는 불필요하게 새로운 하위 쉘을 생성하도록 강제하므로 최적화되거나 최적화되지 않을 수 있습니다.

참고 2: 두 형식 모두 A출력이 생성되지 않는다고 가정합니다. 이는 귀하의 예에서는 사실이지만 일반적으로 반드시 그런 것은 아닙니다. 이는 다음을 통해 피할 수 있습니다.

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

답변3

수락자 답변은 정확하지만 잠재적인 사용 사례를 다루지 않습니다.~ 아니다A의 입력으로 의 출력을 갖습니다 D. 이를 달성하려면 A필요에 따라 스트림 리디렉션이 필요합니다 .

  • 어쨌든 출력을 삭제하려면 다음을 수행하십시오 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의 답변원래 답변을 작성할 때 눈치 채지 못했습니다.)

관련 정보