OSX - วิธีปิดหน้าต่าง Terminal โดยอัตโนมัติหลังจากที่คำสั่ง“ exit” ดำเนินการ


104

เมื่อฉันใช้ Terminal เสร็จแล้วฉันต้องการออก ตอนนี้ฉันมีสามทางเลือก:

  1. killall Terminal มันจะจบกระบวนการ แต่ทันทีทันใด ฉันไม่คิดว่านี่เป็นความคิดที่ดีที่สุด

  2. โทรออก ฉันได้เปลี่ยนการตั้งค่าดังนั้นทางออกเพื่อปิด Terminal แม้ว่าแอปจะยังคงเปิดอยู่ใน Dock และไม่ได้ทำสิ่งที่ฉันต้องการให้ทำ

  3. คลิกขวา> ออก อย่างไรก็ตามนี่ไม่ใช่คำสั่ง Terminal ที่จะออก

ตอนนี้ฉันควรออกและปิด Terminal ทางไหนดี? ฉันเคยได้ยินบางอย่างเกี่ยวกับ osascript แต่ฉันก็ไม่แน่ใจเหมือนกัน ฉันต้องการออกและปิดเพื่อไม่ให้ Terminal เปิดอีกต่อไปทั้งในรูปแบบหน้าต่างและแบบกระบวนการ


ชอบkill, killallค่าเริ่มต้นส่งSIGTERMซึ่งสามารถจับได้ บางโปรแกรมจับมันทำความสะอาดตัวเองและออกอย่างสง่างาม ไม่รู้ว่าถ้าTerminal.appอยู่ท่ามกลางพวกเขา อย่างไรก็ตามฉันสงสัยว่าสิ่งนี้จะดีกว่าสำหรับAsk Differentหรือ Super User ในระยะสั้นเนื่องจากดูเหมือนจะไม่มีเนื้อหาการเขียนโปรแกรมใด ๆ
dmckee --- อดีตผู้ดูแลลูกแมว

1
ฉันคิดว่าคำถามน่าจะเป็นประโยคที่ดีกว่า“ จะออกจาก Terminal หลังจากเชลล์ตัวสุดท้ายออกได้อย่างไร”
Chris Page

คำตอบ:


194

ใน Terminal.app

ค่ากำหนด> โปรไฟล์> (เลือกโปรไฟล์)> เชลล์

บน 'เมื่อเปลือกออก' เลือก 'ปิดหน้าต่าง'


@PrabhuKonchada จะไม่แย่เกินไปถ้าคุณต้องการใช้พื้นที่นั้นเพื่อป้อนข้อมูลของผู้ใช้ แต่คำตอบของ insanikov จะทำให้ฉันรู้สึกดี
Frankenmint

ชัดเจนและสะอาดสมบูรณ์แบบ
aydinugur

12
ใน OS X เวอร์ชันใหม่กว่าคุณสามารถพบตัวเลือกนี้ได้ใน 'การตั้งค่า> โปรไฟล์> (เลือกโปรไฟล์)> เชลล์
XtraSimplicity

คุณสามารถใช้ลิงค์เพื่อดูข้อมูลขั้นตอนที่ชาญฉลาดมากขึ้น cnet.com/news/terminal-tip-close-windows-after-clean-exit
Krishan Kumar Mourya

1
คุณยังสามารถเลือกโปรไฟล์ทั้งหมดและทำการเปลี่ยนแปลงทั้งหมดได้ในครั้งเดียว

31

Command-Q รุ่นเก่าที่ดีเป็นอย่างไร?


เขาหมายถึงคำสั่ง Q นี่เป็นวิธีการที่ดีหรือเปล่า? ดูเหมือนไม่ต่างอะไรกับ killall สำหรับฉัน
darksteel

@darksteel: Command-Q เป็นวิธีที่เหมาะสมในการปิดแอปบน Mac การทำ killall ก็น่าจะใช้ได้เช่นกันเนื่องจากแอพได้รับคำสั่งให้ยุติอย่างหมดจด
tomlogic

2
ใช่ฉันตั้งใจจะพิมพ์ "Command" แต่มันออกมาเป็น Ctrl ฉันว่ามันเป็นกรณีของ PEBBAF (ปัญหาอยู่ระหว่างสมองกับปลายนิ้ว)
holygeek

kill / killall ไม่ใช่วิธีที่ดีในการยุติแอปพลิเคชันโดยทั่วไป นั่นอาจเป็นการละทิ้งสถานะที่ไม่ได้บันทึกหรือบันทึกสถานะที่ไม่ได้สะท้อนให้เห็นอย่างถูกต้องว่าแอปพลิเคชันจะมีลักษณะอย่างไรหากคุณเลิกใช้ Mac OS X มีคุณสมบัติ“ การยุติอย่างกะทันหัน” ซึ่งโปรแกรมสามารถระบุได้ว่าเมื่อใดที่พวกเขาอยู่ในสถานะที่ปลอดภัยที่จะฆ่าพวกเขา (ด้วย SIGKILL ในความเป็นจริง) และหากคุณตรวจสอบสถานะของ Terminal ด้วย Activity Monitor เพื่อตรวจสอบว่า มันปลอดภัยที่จะฆ่ามันก่อน (แสดงคอลัมน์“ การยุติอย่างกะทันหัน” และมองหา“ ใช่”) จากนั้นคุณสามารถทำได้ แต่คุณไม่สามารถทำให้ขั้นตอนการทำงานนั้นเป็นไปโดยอัตโนมัติได้อย่างง่ายดาย
Chris Page

เราสามารถใช้ command-Q ได้เสมอหลังจากออกซึ่งจะปิดกระบวนการทั้งหมดแล้วปิดเทอร์มินัล
Optimus Prime

29

ในแอพ Terminal แท็บPreference >> Profiles

เลือกแท็บเชลล์ทางด้านขวา ป้อนคำอธิบายภาพที่นี่

คุณสามารถเลือกไม่ถามก่อนปิดเพื่อระงับคำเตือน


5
ฉันทำได้ด้วยการWhen shell exits:"ปิดหน้าต่าง"
Anup

1
คำตอบนี้ใช้ไม่ได้กับฉันเมื่อเลือก "ไม่เคย" อย่างไรก็ตามความคิดเห็นของ @ Anup เกี่ยวกับ "ปิดหน้าต่าง" เป็นเคล็ดลับสำหรับฉัน
Ultimater

12

จริงๆแล้วคุณควรตั้งค่าคอนฟิกบน Terminal ของคุณเมื่อ Terminal ของคุณขึ้นกด+ ,จากนั้นคุณจะเห็นหน้าจอด้านล่าง:

ป้อนคำอธิบายภาพที่นี่

จากนั้นกดแท็บเปลือกและคุณจะเห็นหน้าจอด้านล่าง:

ป้อนคำอธิบายภาพที่นี่

ตอนนี้เลือกClose if the shell exited cleanlyสำหรับเมื่อออกจากหอย

ตามการกำหนดค่าข้างต้นทุกครั้งที่มีexitคำสั่ง Terminal จะปิด แต่จะไม่ปิด


11

คุณสามารถใช้ AppleScript ผ่านosascriptคำสั่ง:

osascript -e 'tell application "Terminal" to quit'

ฉันไม่ได้ลองใช้คำสั่ง osascript แต่มีปัญหาสองอย่างที่ฉันพบกับสิ่งนี้: 1. มันค่อนข้างนานสำหรับคำสั่งที่จะออก มันควรจะง่ายกว่านี้ไม่ใช่หรือ? ฉันชอบใน Windows ที่ exit ยกเลิก command prompt 2. ยังคงแจ้งให้ฉันออกจาก Terminal ฉันต้องการให้มันผ่านไปตามการเคลื่อนไหว มีหน้าต่างขึ้นมาถามว่าฉันอยากจะเลิกจริงๆหรือ
darksteel

1
@darksteel: 1. เพิ่มนามแฝงในของคุณ.bashrc(หรือเทียบเท่าหากคุณใช้เชลล์อื่น) ฉันยังคงคิดถึงคำตอบของ 2
icktoofay

ฉันคิดว่าคำสั่ง Q ทำงานได้ดีที่สุด แต่ฉันอยากรู้วิธีตั้งค่านามแฝงอย่างถูกต้อง มีคำสั่งบางอย่างเช่น "ping google.com" ที่ฉันทำบ่อยพอที่จะใช้นามแฝงมากกว่า
darksteel

@darksteel: นี่เป็นวิธีการคิดมาก แต่เพื่อป้องกัน 2 คุณสามารถเริ่มกระบวนการ daemonized ที่หลับไปประมาณหนึ่งวินาทีจากนั้นexitหลังจากเริ่มกระบวนการ daemonized หลังจากกระบวนการ daemonized รอสักครู่ก็สามารถเรียกใช้osascriptตามที่อธิบายไว้
icktoofay

@darksteel: คุณยังสามารถเรียกปุ่มกดผ่าน:osascript tell application "System Events" to keystroke "a" using command downสิ่งนี้อาจมีปัญหาเช่นกัน
icktoofay

9

ในหน้าต่างเทอร์มินัลคุณสามารถพิมพ์:

kill -9 $(ps -p $PPID -o ppid=)

สิ่งนี้จะฆ่ากระบวนการแอ็พพลิเคชัน Terminal ซึ่งเป็นพาเรนต์ของพาเรนต์ของกระบวนการปัจจุบันดังที่เห็นโดยคำสั่ง kill

ในการปิดหน้าต่างเทอร์มินัลจากภายในสคริปต์ที่ทำงานอยู่คุณต้องเพิ่มขึ้นอีกหนึ่งระดับในลำดับชั้นของกระบวนการดังนี้:

kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=) 

7
FYI วิธีนี้จะฆ่าหน้าต่างเทอร์มินัลอื่นด้วย
tresf

และอย่าใช้kill -9เว้นแต่คุณจะรู้ว่าสัญญาณอื่น ๆ ใช้ไม่ได้
tripleee

9

ctrl + dฉันได้รับการใช้ มันจะพาคุณไปยังปลายทางที่คุณได้เริ่มคำสั่ง sqlite3 ตั้งแต่แรก


5

osascript -e "tell application \"System Events\" to keystroke \"w\" using command down"

สิ่งนี้จำลองการกดปุ่มCMD+w

หากคุณต้องการให้ Terminal ปิดโดยสมบูรณ์คุณสามารถใช้: osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"

สิ่งนี้ไม่ได้ให้ข้อผิดพลาดใด ๆ และทำให้ Terminal หยุดอย่างสมบูรณ์


4

นอกจากนี้คุณยังสามารถใช้คำสั่งที่ซับซ้อนนี้ซึ่งไม่ทำให้เกิดคำเตือนเกี่ยวกับการยุติกระบวนการของตัวเอง:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

คำสั่งนี้ค่อนข้างยาวดังนั้นคุณสามารถกำหนดนามแฝง (เช่นquit) ในโปรไฟล์ bash ของคุณ:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

วิธีนี้จะช่วยให้คุณพิมพ์quitลงในเทอร์มินัลได้โดยไม่ต้องยุ่งยากกับการตั้งค่าอื่น ๆ


2

ใช้osascriptคำสั่งในโค้ดของคุณตามที่ icktoofay กล่าวถึง:osascript -e 'tell application "Terminal" to quit'

จากนั้นเปิดการตั้งค่าเทอร์มินัลไปที่การตั้งค่า> เชลล์และตั้งค่า "แจ้งก่อนปิด:" เป็น "ไม่เลย" ตอนนี้เทอร์มินัลควรปิดอย่างสมบูรณ์ (ไม่เปิดค้างไว้ในท่าเรือของคุณ) และเพิกเฉยต่อข้อความแจ้งก่อนที่จะออก หากคุณเปิดหน้าต่าง Terminal เพียงหน้าต่างเดียวและosascriptคำสั่งคือโค้ดบรรทัดสุดท้ายควรรอให้คำสั่งใด ๆ ที่คุณเรียกใช้ก่อนจะเสร็จสิ้น

สิ่งนี้จะไม่เหมาะอย่างยิ่งหากคุณกำลังเรียกใช้สคริปต์ในหน้าต่างเดียวกันหรือหน้าต่างอื่น ๆ ในพื้นหลัง (ตัวอย่างเช่นคุณอาจเรียกใช้คำสั่งในพื้นหลังและใช้หน้าต่างปัจจุบันต่อไปสำหรับคำสั่งอื่น ๆ หากคำสั่งแรกตามด้วยเครื่องหมายและ ); ระวัง!

หากคุณรวมosascriptโค้ดไว้ในไฟล์เชลล์สคริปต์คุณอาจเรียกมันด้วยชื่อไฟล์ที่มีสาระสำคัญใด ๆ ก็ได้ตราบใดที่มันอยู่ในเส้นทางการค้นหาของ Terminal ( echo $PATHให้รันเพื่อดูว่า Terminal ค้นหาสคริปต์ที่ใด)


1

สร้างสคริปต์:

cat ~/exit.scpt

แบบนี้:

  • หมายเหตุ: หากมีเพียงหน้าต่างเดียวให้ออกจากแอปพลิเคชันมิฉะนั้นจำลองcommand + wเพื่อปิดแท็บ)

tell application "Terminal" set WindowNum to get window count if WindowNum = 1 then quit else tell application "System Events" to keystroke "w" using command down end if end tell

จากนั้นเพิ่มนามแฝงใน * shrc ของคุณ

เหมือนvi ~/.bashrcหรือzshrc(อย่างอื่น?)

เพิ่มมัน: alias exit="osascript ~/exit.scpt"

และแหล่ง ~ / .bashrc หรือเปิด terminal.app ของคุณอีกครั้ง


0

ฉันใช้

ออกจากขั้ว -n

ในตอนท้ายของสคริปต์ของฉัน คุณต้องตั้งค่าเทอร์มินัลไม่ให้แจ้งในการตั้งค่า

ดังนั้น Terminal> การตั้งค่า> การตั้งค่า> เชลล์ เมื่อเชลล์ออก ปิดหน้าต่าง พรอมต์ก่อนปิด ไม่


0

ฉันลองใช้คำตอบหลายรูปแบบที่นี่ ไม่ว่าฉันจะลองทำอะไรฉันก็สามารถค้นหากรณีการใช้งานที่ผู้ใช้ได้รับแจ้งให้ปิด Terminal

เนื่องจากสคริปต์ของฉันเป็นแบบธรรมดา ( drutil -drive 2 tray open- เพื่อเปิดไดรฟ์ดีวีดีเฉพาะ) ผู้ใช้จึงไม่จำเป็นต้องเห็นหน้าต่าง Terminal ในขณะที่สคริปต์ทำงาน

วิธีแก้ปัญหาของฉันคือเปลี่ยนสคริปต์ให้เป็นแอปซึ่งเรียกใช้สคริปต์โดยไม่ต้องแสดงหน้าต่าง Terminal ข้อดีเพิ่มเติมคือหน้าต่างเทอร์มินัลใด ๆ ที่เปิดอยู่แล้วยังคงเปิดอยู่และหากไม่มีการเปิดอยู่แสดงว่า Terminal จะไม่อยู่หลังจากสคริปต์สิ้นสุดลง ดูเหมือนว่าจะไม่เปิด Terminal เลยเพื่อเรียกใช้ bash script

ฉันทำตามคำแนะนำเหล่านี้เพื่อเปลี่ยนสคริปต์ของฉันให้เป็นแอป: https://superuser.com/a/1354541/162011


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