답변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
, ( ... )
후자는 최적화될 수도 있고 그렇지 않을 수도 있는 새로운 서브쉘 생성을 불필요하게 강제하기 때문입니다.
참고 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의 답변원래 답변을 썼을 때 눈치 채지 못했습니다. )