A && B || C | D
B 또는 C가 D로 파이프되도록 명령 구조를 다시 쓰는 방법이 있습니까?
현재 명령을 사용하면 B 만 또는 C와 D가 모두 실행됩니다.
예를 들면 다음과 같습니다.
답변
bash에서는 괄호를 사용할 수 있습니다.
(A && B || C) | D
이 방법으로의 출력 A && B || C
이로 파이프됩니다 D
.
답변
이것을 다음과 같이 쓸 수 있습니다
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
답변
수락 자 답변은 정확하지만 의 입력으로 출력을 갖지 않는 잠재적 사용 사례를 다루지 않습니다 . 이를 위해서는 필요에 따라 스트림 리디렉션이 필요 합니다.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의 답변 의 마지막 부분도 참조하십시오 .)