파이프라인 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 || CD.

답변2

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

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

답변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의 답변원래 답변을 썼을 때 눈치 채지 못했습니다. )

관련 정보