ฉันต้องการรันคำสั่งเชลล์ piped จำนวนหนึ่งจากสคริปต์ที่ไม่ใช่ BASH (เช่นสคริปต์ PHP) ดังนี้:
command1 | command2 | command3
ดังนั้นหากcommand1
ล้มเหลวด้วยรหัสออกที่ไม่ใช่ศูนย์คำสั่งอื่น ๆ ก็จะล้มเหลวเช่นกัน จนถึงตอนนี้สิ่งที่ฉันเกิดขึ้นคือ:
set -o pipefail && command1 | command2 | command3
แม้ว่ามันจะทำงานได้ดีจากเทอร์มินัล แต่จะสร้างสิ่งนี้หากเรียกใช้งานจากสคริปต์:
sh: 1: set: ตัวเลือกที่ผิดกฎหมาย -o pipefail
/bin/sh set -o pipefail
มันจะบอกว่า/bin/sh: 0: Can't open set
(สิ่งเดียวกันกับsudo
) หวังว่าฉันจะทดสอบมันถูกต้อง ระบบคือ Ubuntu 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
หรือไม่