รีสตาร์ท bash จากเทอร์มินัลโดยไม่ต้องรีสตาร์ทแอปพลิเคชั่นเครื่อง (mac)?


46

ฉันได้ดูรอบ ๆ เพื่อตอบคำถามนี้ แต่ฉันดูเหมือนจะไม่พบ (ซึ่งแปลก)

คำถามของฉันคือมีวิธีง่าย ๆ ในการรีสตาร์ทเซสชัน bash จากภายในเทอร์มินัลบน mac ฉันต้องการพฤติกรรมแบบเดียวกับที่ฉันปิดแอปพลิเคชั่นเทอร์มินัลและเริ่มต้นใหม่อีกครั้ง (ตัวแปรทั้งหมดรีเซ็ต, .bash_profile แหล่งที่มา ฯลฯ )

ฉันรู้วิธีแหล่ง. bash_profile แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ หนึ่งในเหตุผลที่ฉันต้องการทำเช่นนี้เป็นเพราะปลั๊กอินสำหรับพรอมต์ทุบตีของฉันมีรหัสที่ป้องกันไม่ให้สีโหลดหลายครั้ง ดังนั้นการจัดหา. bash_profile จะไม่โหลดตัวแปรสีอีกครั้งและฉันต้องรีสตาร์ทแอปพลิเคชันเทอร์มินัลเพื่อรับผลการเปลี่ยนแปลง

คำตอบ:


64

exec bash ควรแทนที่กระบวนการเชลล์ปัจจุบันด้วย (ตัวอย่างใหม่ของ) ทุบตี


2
ทุบตีในแอปพลิเคชันเทอร์มินัลเป็นเชลล์แบบโต้ตอบและexec bashรีสตาร์ทเชลล์แบบโต้ตอบนั้นแล้วหรือไม่ นอกจากนี้คุณสามารถอธิบายได้อย่างชัดเจนว่าคำสั่ง exec ทำอะไรและมีตัวเลือกอะไรบ้าง? ขอบคุณ!
Mattias

exec แทนที่กระบวนการปัจจุบันด้วยกระบวนการใหม่ Bash มีเนื้อหาที่เขียนได้ดีมาก แต่ก็ยากที่จะค้นหา manpage; พิมพ์man bashค้นหาอินสแตนซ์สุดท้ายของสตริง SHELL BUILTIN คำสั่งแล้วเลื่อนลงไปที่ exec กล่าวโดยย่อการผ่านการ-cตั้งค่าสถานะจะเรียกใช้โดยไม่มีตัวแปรสภาพแวดล้อมใด ๆ (ซึ่งอาจจำเป็นสำหรับวัตถุประสงค์ของคุณฉันไม่รู้) และอาร์กิวเมนต์อื่น ๆ -l และ -a อาจไม่ใช่สิ่งที่คุณต้องการ / ปิดบังและคุณสมบัติเฉพาะ) นอกจากนี้คุณยังสามารถใช้ exec เพื่อเปิดตัวอธิบายไฟล์ใหม่ในเชลล์ปัจจุบันหากคุณไม่ใช้คำสั่ง
Muzer

คุณสามารถแสดงตัวอย่างวิธีการใช้ exec เพื่อเปิดไฟล์ descriptors ใหม่ในเชลล์ปัจจุบันได้หรือไม่? และสิ่งที่เกี่ยวกับคำถามของฉันเกี่ยวกับเปลือกโต้ตอบ / เข้าสู่ระบบ เชลล์รันในเทอร์มินัลเป็นเชลล์แบบโต้ตอบหรือไม่และเป็นที่คำสั่ง exec ทั้งหมดแตะหรือไม่ สุดท้ายคำตอบที่ได้รับการอนุมัติของคำถามนี้จะแนะนำคำสั่ง exec ด้วยแฟล็ก -l แต่ฉันไม่เข้าใจว่ามันทำอะไร ขอโทษที่ถามมากฉันแค่อยากเข้าใจคำสั่งที่ฉันใช้
Mattias

1
ขอโทษค่ะ ฉันไม่แน่ใจเกี่ยวกับ Macs แต่ในโลก Linux อย่างน้อย shell ที่รันจากเทอร์มินัลกราฟิกนั้น (ปกติ) ไม่ใช่ login shells และคุณเพียงรีสตาร์ทเชลล์แบบโต้ตอบและไม่ใช่เทอร์มินัลหรือเชลล์ล็อกอินของคุณ -lนี่คือข้อโต้แย้งที่จะทุบตีและทำให้มันทำงานเหมือนเปลือกเข้าสู่ระบบ การเปิดไฟล์ descriptors ในเชลล์ปัจจุบันไม่มีอะไรเกี่ยวข้องกับคำถามของคุณ แต่คุณสามารถใช้exec 4<>test.txtตัวอย่างเพื่อทำให้ file descriptor 4 ชี้ไปที่ test.txt จากนั้นในเชลล์ที่เหลือคุณสามารถทำการecho test>&4ส่งออกไปยัง test.txt
Muzer

1
@Muzer ด้วยเหตุผลที่ฉันไม่สามารถพูดได้ว่าฉันทั้งหมดเห็นด้วยOSX ได้ตัดสินใจว่าการเลียนแบบ GUI ขั้วจะทำงานเปลือกหอยเข้าสู่ระบบ
terdon

1

คำตอบที่ได้รับการยอมรับนั้นยอดเยี่ยมสำหรับเชลล์ที่ใช้ bash ซึ่งเป็นสิ่งที่ OP ถาม แต่ฉันใช้ Terminal บน macOS กับเชลล์ที่ไม่ใช่ค่าเริ่มต้น (zsh) และการรันคำสั่งexec bashเห็นได้ชัดว่าไม่มีผลตามที่ต้องการ : มันเปิดตัวทุบตีแทนเปลือกเริ่มต้นของฉัน

ดังนั้นคำสั่ง environment-agnostic จะexec $SHELLใช้ตัวแปรสภาพแวดล้อม$SHELLที่เก็บเชลล์เริ่มต้นสำหรับผู้ใช้

นอกจากนี้โปรดทราบว่า Apple จะแทนที่ bash ด้วย zsh ใน macOS Catalina เพื่อให้เอฟเฟ็กต์ OP กำลังมองหาการทำงานอย่างใดอย่างหนึ่งexec zshหรือexec $SHELLจะเป็นวิธีที่จะดำเนินการหลังจากอัปเดตเป็น macOS 10.15

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