คำสั่งใด ๆ ในเทอร์มินัลของฉันที่ออกด้วยรหัสที่ไม่ใช่ศูนย์จะปิดหน้าต่างเทอร์มินัลของฉัน


22

ตอนแรกมันค่อนข้างตลกเหมือนเล่น "Bash Roulette" ... แต่ตอนนี้มันเก่าขึ้นแล้ว

คำสั่งใด ๆ ในเทอร์มินัลของฉันที่ออกด้วยรหัสที่ไม่ใช่ศูนย์จะปิดหน้าต่างเทอร์มินัลของฉัน

ฉันได้รับการบอกว่าบางทีฉันอาจset -eตั้งค่าสคริปต์ทุบตีไว้ที่ใดที่หนึ่งที่สถานีปลายทางของฉัน

ฉันได้ตรวจสอบ.bash_profile/ .bashrc/ .profileแล้วและดูเหมือนว่าจะไม่set -eอยู่ในนั้น

จะมีผู้ร้ายคนอื่น ๆ อีกหรือไม่?


7
ดำเนินการ a set +eมันซ่อมแซมปัญหาได้หรือไม่? ถ้าเป็นเช่นนั้นซึ่งฉันถือว่าคุณต้องมองหามันset -eต่อไป อาจอยู่ในเวอร์ชันสากลของไฟล์เหล่านี้/etcในหรือในสคริปต์อื่น ๆ ที่มาจากพวกเขา ย้ายไฟล์ปรับแต่งของคุณออกไปหากปัญหาได้รับการแก้ไขจากนั้นเพิ่มบรรทัดในหน่วยย่อย ๆ เพื่อดูว่ามันจะแตกที่ใด
egmont

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapอาจเป็นข้อมูล
muru

คุณสามารถตรวจสอบชุดของค่าสถานะเปลือกเปิดใช้งานอยู่กับตัวแปรพิเศษเช่นดังนั้น:- echo $-
David Foerster

คำตอบ:


21

เอาล่ะแน่นอนมันเป็นทางset -eที่ทำให้เกิดปัญหาของฉัน

วิธีที่ฉันพบว่าset -eใช้งานอยู่bash -lx

สิ่งที่ดีที่สุดที่ควรทำคือใช้:

bash -lx > lx.log 2>&1

จากนั้นเปิดไฟล์บันทึกนั้นและทำการค้นหาset...

เมื่อคุณพบว่าเอาแต่ใจset -eคุณสามารถลบบรรทัดนั้นและปัญหาของคุณควรจะหายไป! (การรีสตาร์ทเครื่องอาจเป็นความคิดที่ดี)

ในกรณีของฉันset -eมันอยู่ในไฟล์ที่. bash_profile ซอร์ส แต่บรรทัดไม่ได้อยู่ใน. bash_profile เอง


3
สิ่งที่ปลอดภัยsourceในเชลล์ของคุณคือชุดเล็กกว่า "เชลล์สคริปต์แบบสุ่ม" -eอาจมีประโยชน์ในสคริปต์จริงสำหรับการตรวจสอบข้อผิดพลาดที่เป็นใบ้ (หรือเพื่อให้แน่ใจว่าคุณไม่ลืมที่จะตรวจสอบสิ่งผิดพลาด)
Peter Cordes

เห็นได้ชัดว่าเป็นกรณี ... ฉันหวังว่าจะมีบางสิ่งบางอย่างเช่นglobal set -eนั้นset -eเท่านั้นที่มีผลต่อสคริปต์ที่มี
Alexander Mills

@AlexanderMills ทำเช่นนั้นคุณสามารถตรวจสอบ$-เพื่อตรวจสอบการตั้งค่าสถานะในสคริปต์ภายในและเรียกคืนสถานะในตอนท้ายหรือเพียงแค่รีเซ็ตที่สคริปต์หลักหากคุณรู้ว่าคุณมีสคริปต์ที่มาที่จะตั้ง
ilkkachu

ดังนั้นฉันเดาว่าlocal set -eจะใช้ได้เฉพาะในฟังก์ชันทุบตีเท่านั้น?
Alexander Mills

13

หากคุณเพียงแค่ต้องการที่จะแก้ปัญหารวมset +eอยู่ในของคุณ.bashrc- ในตอนท้าย

คุณสามารถไปขุด - มีอีกหลายที่ที่set -eอาจ - แต่จะดูแลมาก

อย่างไรก็ตามหากset -eเป็นส่วนหนึ่งของคุณ$PROMPT_COMMANDดังนั้นข้อมูลข้างต้นจะไม่ทำงาน ลองprintf '%s\n' "$PROMPT_COMMAND"และดูว่ามีอะไรอยู่ในนั้น


บนเครื่องของฉันเมื่อฉันเปิด terminal ให้printf '%s\n' "$PROMPT_COMMAND"ผลแค่ช่องว่างไม่มีอะไรที่มี
อเล็กซานเดมิลส์

@AlexanderMills แล้วนั่นไม่ใช่ปัญหาของคุณ การใช้งานทั่วไปอย่างหนึ่ง$PROMPT_COMMANDคือการอัพเดตชื่อแท็บเทอร์มินัลหรือชื่อหน้าต่าง MacOS X และ Ubuntu ทั้งสองทำสิ่งนี้ ดูapple.stackexchange.com/q/220641/151730สำหรับข้อมูลเกี่ยวกับสิ่งนี้สำหรับ Mac
ไวลด์การ์ด

ฉันพบคำตอบของปัญหาและเพิ่มคำตอบของตัวเองset +eไม่ได้ผลอาจเป็นเพราะก่อนการset -eโทรในไฟล์ bash ที่มาของฉัน
Alexander Mills

1
@AlexanderMills ใช่ฉันคิดว่านั่นเป็นนัย ฉันต้องการผนวก set +eคุณ.bashrcไม่ได้ใส่ไว้ในตอนเริ่มต้น ฉันได้อธิบายไว้อย่างชัดเจนในคำตอบของฉันตอนนี้ ดีที่คุณพบแหล่งที่มา!
สัญลักษณ์แทน

ใช่set +eเป็นเพียงเครื่องช่วยวง แต่คุณระบุว่า
Alexander Mills
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.