Làm thế nào để lệnh exit hoạt động trên một thiết bị đầu cuối Unix?


14

Ai đó có thể vui lòng giải thích cách exithoạt động của lệnh trong thiết bị đầu cuối Unix?

Một tìm kiếm man exit which exitkhông hữu ích và tôi đã gặp vấn đề sau đây.

Sau khi cài đặt thêm các gói cho Anaconda và PyCharm trên hệ thống Red Hat mới của tôi, tôi nhận thấy rằng bất cứ khi nào tôi gọi exitđể thoát ra khỏi phiên cuối, tôi sẽ nhận được một loạt lỗi và sau đó thiết bị đầu cuối thoát như mong đợi. Các lỗi dường như gợi ý rằng cuộc gọi của tôi exitđang kích hoạt một cuộc gọi rm ~/anaconda3/.../rm ~/PyCharm/....gây ra lỗi. Tất cả các thư mục cũng có vẻ là vị trí của các gói tôi đã tải xuống cho các chương trình này (tức là numpy), xem bên dưới.

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

Đã giải quyết

Trong ~/.bash_logouttập tin của tôi , có một dòng

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

Bình luận dòng này ra đã dừng các thông báo lỗi. Nó xuất hiện để tìm kiếm và xóa tất cả các tập tin tạm thời. Nhưng nó cũng cố gắng tìm các thư mục có từ "lõi" trong đó và cũng xóa các thư mục đó. Đây là một cài đặt trước trong hệ thống.


Chỉ cần làm rõ: bạn đang nói rằng, sau khi bạn cài đặt tiện ích trên các gói cho Anaconda và PyCharm, bạn nhận được một loạt các lỗi khi bạn sử dụng exitđể thoát ra khỏi đó phiên Terminal - hoặc rằng điều đó xảy ra mỗi khi bạn sử dụng exitsau đó?
G-Man nói 'Phục hồi Monica'

1
Nó đã xảy ra cho mỗi phiên cuối sau khi cài đặt các add này trên các gói.
arie64

1
Rất lạ, bạn đã xác minh nếu exitlà bí danh?
Dominique

3
Lý do tại sao nó cố gắng xóa corecác tệp là vì chúng thường là các tệp crashdump ( lõi lõi ) chiếm dung lượng nhưng hiếm khi hữu ích trừ khi bạn đang phát triển phần mềm bị sập. Trong trường hợp này, nó đang cố xóa một thư mục có tên core, nhưng không thành công (và điều tốt là nó thất bại - numpy.corelà điều cần thiết cho NumPy!).
nneonneo

Hầu hết các hệ thống ngày nay được cấu hình để không ghi các bãi lõi theo mặc định (bằng cách làm ulimit -c 0mặc định). find -exec rmLệnh đó không phải là thứ tôi muốn, nhưng bạn có thể thêm -type fvào nó. Bạn cũng có thể làm cho nó hiệu quả hơn nhiều khi xóa nhiều tệp bằng cách sử dụng -exec rm {} +thay vì ... \;, vì vậy nó sẽ bó nhiều đối số vào một rmdòng lệnh (như xargs)
Peter Cordes

Câu trả lời:


20

Thông thường, bạn sẽ chỉ thấy thực thi khi thoát khỏi trình bao nếu bạn đã cấu hình thủ công này. Nhưng có lẽ một trong những gói bạn đã cài đặt đi kèm với tập lệnh shell bash exit ...

kiểm tra;

~ / .bash_logout

có thể bạn sẽ tìm thấy một cuộc gọi kịch bản từ đó, đó là một cuộc gọi kỳ quặc ...


OP không nói về việc đăng xuất mà là thoát khỏi vỏ.
phản ứng

1
@ c gặp gỡ, họ cũng không nói rằng đó không phải là một vỏ đăng nhập đang chạy trong phiên cuối của họ.
ilkkachu

Tôi đang ở trong vỏ đăng nhập và hành vi này cũng xảy ra với một lệnh gọi đến <code> đăng xuất </ code>. Trong <code> ~ / .bash_logout </ code> tôi có một dòng
arie64

<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </ code> mà sau khi nhận xét, lỗi không xảy ra xảy ra Vì vậy, tôi nghĩ rằng các ý kiến ​​nơi chính xác, dòng này đang cố gắng xóa các tập tin tạm thời. Cảm ơn bạn!
arie64

4
@ arie64 - "<code>" không hoạt động trong các bình luận. Để chỉ ra mã trong các nhận xét về SE, hãy sử dụng " ` "(Grave-accent / Left-single-quote) trước và sau mã. Giống như: `find -xdev ...` để lấy find -xdev ....
Kevin Fegan

25

man bash

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

Các bẫy như vậy thường được sử dụng để dọn sạch các tmpfiles khi thoát, xem /programming/687014/removing-created-temp-files-in-unazed-bash-exit

Xác định bẫy thoát như thế này (để kiểm tra tốt hơn trong trình bao mới):

$ bash
$ trap "rm filetodelete" EXIT

Hiển thị bẫy EXIT đã xác định:

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

Kiểm tra:

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

Lưu ý rằng exitcó thể được "gọi" ngầm. Vì vậy, thay vì exitbạn cũng có thể đã kích hoạt bẫy bằng cách kill -HUP $$.


Đáng để chỉ ra type -a exit-> exit is a shell builtinlà cách bạn biết để đọc trang bash man (hoặc chạy help exitthay vì người đàn ông) ở vị trí đầu tiên.
Peter Cordes

10

Các exitlệnh được đặc biệt được xây dựng trong lệnh trong vỏ. Nó phải được tích hợp sẵn vì nó cần thoát khỏi quá trình shell.

Nó thoát khỏi shell với trạng thái thoát được cung cấp nếu có hoặc bất kỳ lệnh nào khác.

Khi thoát ra, vỏ sẽ chạy EXITbẫy nếu có. Xem đầu ra của trap(trong các vỏ giống như Bourne) cho các vỏ hiện được đặt.

Với nhiều vỏ, nếu vỏ đã được gọi như một cái vỏ đăng nhập (một số hệ thống / người sử dụng cấu hình giả lập thiết bị đầu cuối để bắt đầu một vỏ đăng nhập), nó cũng sẽ chạy mã được lưu trữ trong các tập tin đặc biệt thích ~/.logout, ~/.zlogout, ~/.bash_logoutvà có thể tương ứng với những người thân trong /etctùy thuộc vào vỏ .

Bạn có thể làm một set -x trước khi gọi exitđể có ý tưởng về những lệnh đó đang được chạy từ đâu.


Lời khuyên tuyệt vời để gỡ lỗi vớiset -x
glenn jackman

Bạn có thể lấy nhật ký set -xđầu ra bằng cách chạy bash theo cách không xóa hoặc đóng thiết bị đầu cuối sau khi thoát, hoặc có thể bằng cách thực hiện set -x, exec &> exit_log.txtsau đó gõ một cách mù quáng exit.
Peter Cordes

3

exit là một lệnh "dựng sẵn" của bash, vì vậy không có gì lạ man exit không giúp đỡ.

Tài liệu phù hợp có thể được lấy từ các trang hướng dẫn man bashhoặc bằng lệnh dựng sẵn helpcủa 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.
$

Nếu bạn thực sự muốn biết nó hoạt động như thế nào , hãy xem nguồn: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.