(संभवतः संबंधित Do some programs not accept process substitution for input files? करने के लिए)बैश प्रक्रिया प्रतिस्थापन और सिंकिंग
कुछ बैश इकाई परीक्षण स्क्रिप्ट में मैं लॉग इन करने के और प्रदर्शन stdout और एक आदेश के stderr निम्नलिखित चाल का उपयोग कर रहा:
command > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
यह प्रक्रिया stdout के लिए कुछ आउटपुट उत्पन्न करती है, इसलिए $stdoutF
फ़ाइल कुछ डेटा प्राप्त करती है। तब मैं एक और आदेश जो उत्पादन किसी भी डेटा नहीं चलाएँ:
diff -r "$source" "$target" > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
हालांकि, यह की तरह इस प्रक्रिया को हमेशा से पहले शून्य के लिए परीक्षण चलाया जाता है सफलतापूर्वक खत्म (shunit-ng उपयोग करते हुए) नहीं लगती है:
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
एक 100 रन परीक्षण में यह 25 बार विफल रहा।
यह शून्य के लिए फ़ाइल परीक्षण से पहले sync
कॉल करने के लिए पर्याप्त होना चाहिए:
sync
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
... और/या यह आदेशों के अनुक्रम मजबूर कर काम करना चाहिए:
diff -r "$source" "$target" \
> >(tee "${stdoutF}"; assertNull 'Unexpected output to stdout' "$(<"$stdoutF")")
2> >(tee "${stderrF}" >&2)
। .. और/या tee
यह किसी फ़ाइल के बजाय सीधे assertNull
पर संभव है?
अद्यतन: sync
उत्तर नहीं है - नीचे गिल्स की प्रतिक्रिया देखें।
अपडेट 2: Save stdout, stderr and stdout+stderr synchronously पर चर्चा की गई। उत्तर के लिए धन्यवाद!
धन्यवाद इस भयानक उत्तर के लिए, यह सिर्फ मेरे लिए एक बेहतर व्यवस्थापक बना दिया है! –