मुझे नॉन-बैश स्क्रिप्ट (जैसे 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
?