ฉันกำลังหาสคริปต์ทุบตีในเทอร์มินัลดังนั้นออกจากข้อผิดพลาดด้วย
set -o errexit
ฆ่า terminal ของฉันซึ่งเป็นสิ่งที่น่ารำคาญอย่างมากเพราะฉันต้องปิดเครื่องเทอร์มินัลเปิดอีกอันหนึ่งและรีเซ็ตตัวแปรบางตัว
จนถึงตอนนี้การใช้
command || return
บรรทัดในสคริปต์ทำสิ่งที่ฉันต้องการอย่างแน่นอน
set -o errexit
ที่จะทำ ... แต่ฉันต้องการให้มันทำเพื่อทั้งสคริปต์; ไม่ใช่แค่หนึ่งบรรทัด / คำสั่ง
ฉันมีไฟล์ที่เต็มไปด้วยคำสั่งสำหรับการตั้งค่าไซต์และฉันไม่ควรทำคำสั่ง || กลับ
สำหรับทุก ๆ บรรทัดในไฟล์
มีตัวเลือกชุดอื่นหรืออะไรที่จะ "คืน" แทนที่จะออกจากเทอร์มินัล
- เพื่อความชัดเจนฉันต้องการฆ่าสคริปต์และออกจากเทอร์มินัลในสถานะเดียวกับที่กด ctrl + C เพื่อฆ่าเซอร์วิสที่รันในเทอร์มินัล command || return
ทำอย่างนั้น แต่ฉันไม่ต้องการที่จะยึดติด|| return
กับทุกบรรทัดในไฟล์ ดังนั้นฉันกำลังมองหาสิ่งที่คล้ายกับset -o errexit
ที่ไม่ได้ทำให้สถานีปิดตัวลง
--- หมายเหตุ: การสร้างสคริปต์โง่ที่มีสองบรรทัดในนั้น (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
และวางset -o errexit
ที่ด้านบนของ create.sh
ทำงานตรงตามที่ฉันคาดไว้ อย่างไรก็ตามมันโง่จริงๆที่จะต้องสร้างไฟล์ที่มีสองบรรทัดในนั้นเพียงเพื่อเรียกสคริปต์ทุบตีอีกตัวแทนที่จะเรียกมันจากเทอร์มินัล Ugghhh
นี่คือตัวอย่างบางส่วน:
ใน super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
ใน create.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
ใน terminal:
$ bash super.sh
ผลผลิตตามที่คาดไว้:
my-mac$
วิธีนี้ใช้ได้ผล ช่างเป็นทางออกที่น่ารำคาญ
ฉันต้องการที่จะดำเนินการในไฟล์ stupid super.sh จากเทอร์มินัลไม่ใช่ไฟล์ super.sh: D โดยไม่ต้องปิดเครื่อง นี่คือสิ่งที่เกิดขึ้นกับสิ่งที่ฉันพยายามทำ:
คำสั่ง terminal:
my-mac$ source $create_path blah
ใน create.sh ฉันยังมี set -o errexit
นี่คือผลลัพธ์ที่เทอร์มินัล
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
จากนั้นเทอร์มินัลจะถูกแช่แข็ง Ctrl + C ไม่ทำงานไม่มี Ctrl + D
ถ้าset -o errexit
หากฉันใช้command || return
คำสั่งทุกที่ในไฟล์ create.sh ฉันก็จะได้สิ่งที่ฉันต้องการอย่างแน่นอนในขณะที่รันบรรทัดใน supser.sh บนเทอร์มินัลโดยตรง (แทนที่จะเรียก super.sh จากเทอร์มินัล) แต่นั่นไม่ใช่วิธีแก้ปัญหาในทางปฏิบัติเช่นกัน
หมายเหตุ:ฉันชอบคำตอบของ @terdon เกี่ยวกับการวางไข่เปลือกหอยลูกดังนั้นฉันจึงลงเอยด้วยการวางเปลือกย่อยผ่านสคริปต์แทนที่จะเป็นเทอร์มินัลในขณะที่เขาแสดงคำตอบของเขาโดยใช้วงเล็บปีก( )
การอบสคริปต์ทั้งหมด .. คำตอบของเขา ทำงานเกินไป
source $file_path argument
สคริปต์จะถูกดำเนินการในเปลือกเดียวกันที่ฉันเรียกว่าจาก (สิ่งที่source
ฉันได้รับการบอก ... และทำหน้าที่เหมือนกรณี) command || return
งบอยู่ในไฟล์ที่ฉันกำลังดำเนินการใน terminal