คำสั่ง exit ทำงานบนเทอร์มินัล Unix อย่างไร


14

ใครช่วยกรุณาอธิบายว่าexitคำสั่งทำงานอย่างไรในเทอร์มินัล Unix?

การค้นหาman exit และwhich exitไม่เป็นประโยชน์และฉันได้เจอปัญหาต่อไปนี้

หลังจากติดตั้ง add บนแพ็คเกจสำหรับ Anaconda และ PyCharm ในระบบ Red Hat ใหม่ของฉันฉันสังเกตเห็นว่าเมื่อใดก็ตามที่ฉันถูกเรียกexitให้ออกจากเซสชันเทอร์มินัลฉันจะได้รับข้อผิดพลาดหลายชุดจากนั้นเทอร์มินัลจะหยุด ข้อผิดพลาดดูเหมือนจะแนะนำว่าการโทรของฉันexitกำลังเรียกการโทรrm ~/anaconda3/.../และrm ~/PyCharm/....ทำให้เกิดข้อผิดพลาด ไดเรกทอรีทั้งหมดดูเหมือนจะเป็นที่ตั้งของแพ็คเกจที่ฉันดาวน์โหลดสำหรับโปรแกรมเหล่านี้ (เช่นจำนวนมาก) ดูด้านล่าง

$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...

การแก้ไข

ใน~/.bash_logoutไฟล์ของฉันมีบรรทัด

find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;

การแสดงความคิดเห็นบรรทัดนี้หยุดข้อความผิดพลาด ดูเหมือนว่าจะค้นหาและลบไฟล์ชั่วคราวทั้งหมด แต่มันยังพยายามค้นหาไดเรกทอรีที่มีคำว่า "core" อยู่ในนั้นและลบไดเรกทอรีเหล่านั้นด้วย นี่เป็นการตั้งค่าล่วงหน้าในระบบ


เพื่อชี้แจง: คุณกำลังบอกว่าหลังจากติดตั้งโปรแกรมเสริมสำหรับ Anaconda และ PyCharm คุณจะได้รับชุดข้อผิดพลาดเมื่อคุณใช้exitเพื่อออกจากเซสชันเทอร์มินัลนั้น - หรือที่เกิดขึ้นทุกครั้งที่คุณใช้งานexitหลังจากนั้น
G-Man กล่าวว่า 'Reinstate Monica'

1
เกิดขึ้นสำหรับทุกเซสชันเทอร์มินัลหลังจากติดตั้งโปรแกรมเสริมเหล่านี้บนแพ็คเกจ
arie64

1
แปลกมากคุณยืนยันแล้วว่าexitเป็นชื่อแทนหรือไม่
Dominique

3
สาเหตุที่พยายามลบcoreไฟล์นั้นเป็นเพราะโดยทั่วไปแล้วไฟล์ crashdump ( core dumps ) ซึ่งกินพื้นที่ แต่ไม่ค่อยมีประโยชน์เว้นแต่คุณจะพัฒนาซอฟท์แวร์หยุดทำงาน ในกรณีนี้มันกำลังพยายามลบไดเรกทอรีที่ชื่อcoreซึ่งล้มเหลว (และสิ่งที่ดีมันล้มเหลว - numpy.coreเป็นสิ่งจำเป็นสำหรับ NumPy!)
nneonneo

ระบบส่วนใหญ่วันนี้มีการกำหนดค่าที่จะไม่เขียนการถ่ายโอนหลักโดยค่าเริ่มต้น (โดยการulimit -c 0เริ่มต้น) ว่าfind -exec rmคำสั่งไม่ได้เป็นสิ่งที่ฉันต้องการอยู่แล้ว แต่คุณสามารถเพิ่ม-type fให้กับมัน นอกจากนี้คุณยังสามารถทำให้มันมากมีประสิทธิภาพมากขึ้นในการลบไฟล์หลายไฟล์โดยใช้-exec rm {} +แทน... \;ดังนั้นจึง batches args หลายลงหนึ่งrmบรรทัดคำสั่ง (เช่น xargs)
ปีเตอร์ Cordes

คำตอบ:


20

โดยปกติคุณจะเห็นการทำงานเมื่อออกจากเชลล์หากคุณกำหนดค่านี้ด้วยตนเอง แต่บางทีหนึ่งในแพ็คเกจที่คุณติดตั้งมาพร้อมกับสคริปต์ shell bash exit ...

ตรวจสอบ;

~ / .bash_logout

บางทีคุณอาจจะพบสคริปต์จากที่นั่นมันแปลก ๆ ...


OP ไม่ได้พูดถึงการออกจากระบบ แต่เป็นการออกจากเชลล์
ตอบโต้

1
@countermode พวกเขาไม่ได้ระบุว่ามันไม่ใช่เชลล์ล็อกอินที่รันในเซสชันเทอร์มินัล
ilkkachu

ฉันอยู่ในเชลล์ล็อกอินและพฤติกรรมนี้ก็เกิดขึ้นกับการโทรไปยัง <code> ล็อกเอาต์ </code> ใน <code> ~ / .bash_logout </code> ฉันมีบรรทัด
arie64

<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code> ซึ่งหลังจากใส่ความคิดเห็นแล้วข้อผิดพลาดจะไม่เกิดขึ้น เกิดขึ้น ดังนั้นฉันคิดว่าความคิดเห็นที่ถูกต้องบรรทัดนี้กำลังพยายามลบไฟล์ชั่วคราว ขอขอบคุณ!
arie64

4
@ arie64 - "<code>" ไม่ทำงานในความคิดเห็น ในการระบุรหัสภายในความคิดเห็นของ SE ให้ใช้ " ` "( เครื่องหมายเน้นเสียง / ซ้าย - เครื่องหมายคำพูดเดี่ยว) ก่อนและหลังรหัส ที่ชอบ: `หา -xdev ... ` find -xdev ...ที่จะได้รับ
Kevin Fegan

25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.

กับดักดังกล่าวมักจะถูกใช้เพื่อทำความสะอาด tmpfiles เมื่อออกจากระบบดู /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

กำหนดกับดักทางออกเช่นนี้ (เพื่อการทดสอบที่ดีขึ้นในเชลล์ใหม่):

$ bash
$ trap "rm filetodelete" EXIT

แสดงกับดัก EXIT ที่กำหนด:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT

ทดสอบ:

$ exit
rm: cannot remove filetodelete’: No such file or directory

โปรดทราบว่าexitอาจ "เรียกว่า" โดยปริยายด้วย ดังนั้นแทนที่จะคุณอาจจะยังมีการหารือกับดักโดยexitkill -HUP $$


น่าจะชี้ให้เห็นtype -a exit-> exit is a shell builtinเป็นวิธีที่คุณรู้ในการอ่าน bash man page (หรือเรียกใช้help exitแทนที่จะเป็น man) ในตอนแรก
Peter Cordes

10

exitคำสั่งพิเศษในตัวคำสั่งในเปลือกหอย จะต้องมี built-in เนื่องจากจำเป็นต้องออกจากกระบวนการเชลล์

ออกจากเชลล์พร้อมสถานะออกที่ระบุหากมีหรือคำสั่งสุดท้ายเป็นอย่างอื่น

เมื่อออกจากเปลือกจะทำงานEXITกับดักถ้ามี ดูผลลัพธ์ของtrap(ในเชลล์เหมือนบอร์น) สำหรับรายการที่ตั้งค่าปัจจุบัน

ด้วยเปลือกหอยจำนวนมากถ้าเปลือกที่ถูกเรียกว่าเป็นเปลือกเข้าสู่ระบบ (บางระบบ / ผู้ใช้กำหนดค่าการเลียนแบบขั้วที่จะเริ่มต้นเปลือกเข้าสู่ระบบ) ก็จะเรียกใช้รหัสเก็บไว้ในไฟล์พิเศษเช่น~/.logout, ~/.zlogout, ~/.bash_logoutและอาจจะเป็นคนที่สอดคล้องกันใน/etcขึ้นอยู่กับเปลือก .

คุณสามารถทำการset -xโทรก่อนexitเพื่อรับทราบว่าคำสั่งเหล่านั้นกำลังถูกเรียกใช้จากที่ไหน


คำแนะนำที่ดีในการแก้ไขปัญหาด้วยset -x
เกล็นแจ็

คุณจะได้รับเข้าสู่ระบบของการset -xส่งออกโดยทั้งทุบตีทำงานในทางที่จะไม่ชัดเจนหรือใกล้เคียงสถานีหลังจากที่มันออกมาหรืออาจจะด้วยการทำset -x, แล้วสุ่มสี่สุ่มห้าพิมพ์exec &> exit_log.txt exit
Peter Cordes

3

exitเป็นคำสั่ง "builtin" ของ bash ดังนั้นจึงไม่น่าแปลกใจเลยที่จะman exitไม่ช่วย

เอกสารที่เหมาะสมสามารถหาได้จากหน้าคู่มือman bashหรือด้วยคำสั่ง builtin helpของ bash ( help exit)

$ help exit
exit: exit [n]
    Exit the shell.

    Exits the shell with a status of N.  If N is omitted, the exit status
    is that of the last command executed.
$

หากคุณจริงๆต้องการที่จะรู้วิธีการทำงานมีลักษณะที่มา: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

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