मुझे नॉन-बैश स्क्रिप्ट (जैसे PHP स्क्रिप्ट) से कई पाइप किए गए शेल कमांड को निष्पादित करने की आवश्यकता है:
command1 | command2 | command3
ताकि, यदि command1गैर-शून्य निकास कोड के साथ विफल हो जाए, तो एक-दूसरे कमांड भी विफल हो जाते हैं। अब तक, मैं जो भी लेकर आया हूं वह है:
set -o pipefail && command1 | command2 | command3
लेकिन भले ही यह टर्मिनल से ठीक चलता है, यह स्क्रिप्ट से निष्पादित होने पर इसका उत्पादन करता है:
श: 1: सेट: अवैध विकल्प -o पिपीफेल
/bin/sh set -o pipefailइसे चलाता हूं तो यही कहता है /bin/sh: 0: Can't open set(साथ वाली बात sudo)। आशा है कि मैंने सही परीक्षण किया। प्रणाली उबंटू 12 है
/bin/sh -c "set -o pipefail"; जैसा कि यह था, शेल वर्तमान निर्देशिका में एक स्क्रिप्ट को निष्पादित करने की कोशिश कर रहा था जिसे बुलाया setगया था और इसे नहीं मिला।
/bin/sh -c "set -o pipefail"हालांकि काम नहीं कर रहा bash -c "set -o pipefail"है।
/bin/shजिसके द्वारा पहचान नहीं होती है set -o pipefail। नतीजतन, आपको यह सुनिश्चित करने की आवश्यकता होगी कि स्क्रिप्ट /bin/bashइसके बजाय चलाया जाता है /bin/sh। या, यदि आप आश्वस्त हैं, बहादुर हैं - और शायद मूर्ख - जो भी वर्तमान में या की एक प्रति से जुड़ा हुआ है, जो भी खोल के बजाय /bin/shएक लिंक, या की /bin/bashप्रतिलिपि हो। यदि आप सुनिश्चित करें कि कि /bin/shहै bash, तो आप व्यवहार जो प्रयोग कर रहे हैं bashजब के रूप में चलाने का खुलासा नहीं करता /bin/sh; के bashरूप में उपयोग करें bash।
/bin/shपसंद नहीं हैset -o pipefail। क्या यह वास्तवbashमें भेस में है, या यह एक अलग शेल है? जबbashइसे चलाया जाता है/bin/sh, तो क्या यह स्वीकार किया जाता हैset -o pipefail?