2017-01-17 5 views
2

같은 파이프 라인 무언가를 감안할 때 그러나 이것은 효과가없는 것 같습니다. B의 결과에 상관없이 C가 실행되지 않습니다. 더 나은 솔루션을 찾고 있습니다.조건부 단계는

파이프 라인의 각 단계가 자체 서브 쉘에서 실행된다는 것을 알고 있습니다. 그래서 환경 변수를 다시 파이프 라인에 전달할 수 없습니다. 그러나이 파이프 라인은 많은 파이프 라인이 동시에 실행되는 Gnu 병렬 환경에 있으며 아무도 고유 한 값을 알지 못합니다 (데이터 스트림을 처리하고 소스를 알 필요가 없으며 상위 스크립트가 필요한 분리를 처리합니다). 즉, 임시 파일을 사용하는 것은 실용적이지 않습니다. 그 이유는 파일 이름을 고유하게 만들 수있는 방법이 없기 때문입니다. $$조차도 나에게 각 단계에서 동일한 가치를주지 않는 것 같습니다.

+0

'set -o pipefail'을 볼 수도 있지만, 실제로는 단일 파이프 라인을 사용하는 대신 명령을 분리하면됩니다. –

답변

4

명령이 병렬로 실행되므로 파이프 라인을 조건부로 만들 수 없습니다. 이 실행되어 B이 종료 될 때까지 실행되지 않으면 B의 출력은 어디에 파이프됩니까?

B의 출력을 변수 또는 임시 파일에 저장해야합니다. 예 :

out=$(mktemp) 
trap 'rm "$out"' EXIT 
if A | B > "$out"; then 
    C < "$out" 
else 
    cat "$out" 
fi | D | E 
+0

이것은 내가 필요한 해결책처럼 보입니다. 감사. –

+0

'export -f' 함수에 넣으면 GNU Parallel 용으로 준비되어 있습니다 –

+0

'mktemp'와'trap' 대신 $ PARALLEL_TMP를 사용할 수 있습니다. –

1

문제의 진술에 논리적으로 불가능합니다.

A | B과 같은 파이프를 가정 해 봅니다. 파이프 라인은 A가 끝나기 전에 B가 A에서부터 읽기를 시작하기를 원하기 때문에 특히 존재합니다. 따라서 B가 시작할 때 (상태가 평가 될 때), A는 실패 또는 실패 여부를 아직 알지 못하므로 B도 알 수 없습니다.

할 수있는 일은 마지막 줄에 상태 코드의 일부 유형 인 echo를 넣는 것입니다. 그런 다음 B는 표준 입력을 읽고 입력을 임시 파일로 변수에 저장 한 다음 마지막 행을 받으면 상태를 확인한 다음 조치를 취할 수 있습니다.

물론 다른 방법은 A가 자체 출력을 저장 한 다음 완료되면 A 내부에 조건부를 가지며 파이프 라인에서 B를 제거합니다.

+0

아 ... 물론 ... 때로는 세부 사항에서 길을 잃을 수도 있습니다. 파이프 라인이 어떻게 작동하는지 생각 나게 해 주셔서 감사합니다. –