ฉันต้องการรันคำสั่งเชลล์ 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/shset -o pipefailจริง ๆ แล้วมันbashปลอมตัวหรือเป็นเปลือกที่แตกต่างกัน? เมื่อbashถูกเรียกใช้/bin/shจะยอมรับset -o pipefailหรือไม่