Giải thích tại sao .bash_logout sẽ không chạy các lệnh?


11

Vì vậy, tôi đã tự hỏi làm thế nào để chạy hai dòng mã này mỗi khi tôi đóng một phiên bản mở của Terminal:

history -c
cat /dev/null > ~/.bash_history

Tôi đã export HISTFILE=5khởi động, nhưng vẫn muốn tuôn ra điều đó khi tôi hoàn thành.

Tôi đã thử nhìn xung quanh một chút ở một vài nơikhông gặp nhiều may mắn .

Tôi chạy Linux Mint và cũng lưu ý rằng tôi gặp phải một vấn đề tương tự .bash_profile; cuối cùng, tôi phát hiện ra rằng tôi cần đặt tất cả mã khởi động vào .bashrc, vì vậy có lẽ điều đó có liên quan đến nó. Đây là .bash_logouttập tin của tôi :

#!/bin/bash
# ~/.bash_logout: executed by bash(1) when login shell exits.

#this does nothing on exit...
echo 'logout'; sleep 2s

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    history -c
    cat /dev/null > ~/.bash_history
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

Tôi đã thử sắp xếp lại kịch bản này theo nhiều cách, tôi không chắc là mình không hiểu cách thức hoạt động của bash hay không, và liệu bất kỳ thứ nào trong số này đang chạy ở nơi đầu tiên. Có phải thực tế là tôi chạy Xserverlàm bash xem xét Terminal một cái gì đó không phải là đăng xuất khi thoát?

Nó nói rằng tôi không đăng nhập, điều này sẽ có ý nghĩa:

$> shopt login_shell
login_shell     off

Như một nhận xét chung, nếu bạn đang kiểm tra xem tập lệnh shell config có chạy hay không, tôi khuyên bạn nên đặt echolệnh khi bắt đầu, trước khi nó làm bất cứ điều gì khác có thể can thiệp vào echoviệc chạy. Một lỗi có thể khiến tập lệnh thoát ra trước khi nó kết thúc.
Chris Trang

Tôi đã giả sử từ cách bạn thực hiện điều này và thực tế là bạn đang kiểm tra SHLVL = 1, rằng bạn đã xác minh rằng đó là một vỏ đăng nhập. Là nó? Nó shopt login_shellnói gì
Chris Trang

Câu trả lời:


25

Giả sử bạn đã xác minh rằng đó là shell đăng nhập ( shopt login_shell):

~ / bash_logout chỉ được chạy nếu nó bạn thoát khỏi một cách rõ ràng vỏ với exithoặc logout, hoặc bằng cách gõ Control-D để nhập một end-of-file tại dấu nhắc lệnh. Nếu bạn đóng trình giả lập thiết bị đầu cuối, các quy trình được gửi SIGHUP và bash không chạy ~ / .bash_logout trong trường hợp đó.

Nếu bạn muốn thực hiện công việc bất cứ khi nào bash thoát (và cho dù đó là vỏ đăng nhập hay không), hãy sử dụng trap foo EXIT. Cách thuận tiện nhất để làm điều này là đặt mã của bạn vào hàm shell, ví dụ:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
Tôi cảm thấy lãng phí một vấn đề hoàn toàn tốt cho câu hỏi xấu của tôi. Tôi sẽ hỏi lại nếu tôi vượt qua câu đầu tiên của bạn và vẫn gặp rắc rối. Sheesh.
Droogans

6

~/.bash_logoutchỉ được điều hành bởi một vỏ đăng nhập (chẳng hạn như lớp bạn nhận được trong các phiên tty hoặc với bash -l). Nó bị bỏ qua bởi các shell không đăng nhập, mà hầu hết các thiết bị đầu cuối chạy.

Xem trang hướng dẫn sử dụng bash (1), trong phần "HÓA ĐƠN", để biết thêm chi tiết.


Nếu bạn không muốn giữ lịch sử liên tục, chỉ cần bỏ đặt HISTFILEhoặc đặt HISTFILE=/dev/null. Điều này sẽ tự động loại bỏ lịch sử khi thoát, trong khi vẫn cho phép nó được giữ cho shell hiện tại ( HISTSIZE=100).

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.