อธิบายว่าทำไม. bash_logout จะไม่เรียกใช้คำสั่งหรือไม่


11

ดังนั้นฉันจึงสงสัยว่าจะรันโค้ดสองบรรทัดนี้ได้อย่างไรทุกครั้งที่ฉันปิดอินสแตนซ์เปิดของ Terminal:

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

ฉันexport HISTFILE=5เริ่มต้น แต่ก็ยังต้องการล้างออกเมื่อฉันทำเสร็จแล้ว

ฉันพยายามมองไปรอบ ๆในสถานที่สองแห่งและไม่ได้มีโชคมาก

ฉันใช้ Linux Mint และจะทราบได้ที่นี่ว่าฉันพบปัญหาที่คล้ายกันด้วย.bash_profile; ในที่สุดฉันก็ค้นพบว่าฉันต้องวางโค้ดเริ่มต้นไว้ทั้งหมด.bashrcดังนั้นอาจมีบางอย่างที่เกี่ยวข้องกับมัน นี่คือ.bash_logoutไฟล์ของฉัน:

#!/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

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

มันบอกว่าฉันไม่ได้เข้าสู่ระบบซึ่งจะทำให้รู้สึก:

$> shopt login_shell
login_shell     off

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

ฉันสันนิษฐานจากวิธีที่คุณใช้ถ้อยคำนี้และความจริงที่ว่าคุณกำลังตรวจสอบ SHLVL = 1 ว่าคุณได้ตรวจสอบแล้วว่าเป็นเปลือกเข้าสู่ระบบ ใช่ไหม? สิ่งที่ไม่shopt login_shellพูด?
Chris หน้า

คำตอบ:


25

สมมติว่าคุณยืนยันว่าเป็นเชลล์สำหรับเข้าสู่ระบบ ( shopt login_shell):

~ / .bash_logout จะทำงานเฉพาะเมื่อคุณออกจากเชลล์ด้วยexitหรือlogoutหรือพิมพ์ Control-D เพื่อป้อนจุดสิ้นสุดไฟล์ที่พรอมต์คำสั่ง หากคุณปิดเทอร์มินัลอีมูเลเตอร์กระบวนการจะถูกส่ง SIGHUP และ bash จะไม่ทำงาน ~ / .bash_logout ในกรณีนั้น

หากคุณต้องการที่จะดำเนินการใด ๆ ที่ทำงานออกเวลาทุบตี (และไม่ว่าจะเป็นเปลือกเข้าสู่ระบบหรือไม่), trap foo EXITการใช้งาน วิธีที่สะดวกที่สุดในการทำเช่นนี้คือการใส่รหัสของคุณลงในฟังก์ชันเชลล์เช่น:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
ฉันรู้สึกว่าเป็นปัญหาที่ดีอย่างสมบูรณ์ในคำถามที่ไม่ดีของฉัน ฉันจะถามอีกครั้งว่าฉันผ่านประโยคแรกของคุณและยังมีปัญหาอยู่หรือไม่ Sheesh
Droogans

6

~/.bash_logoutดำเนินการโดยเชลล์ล็อกอินเท่านั้น (เช่นอันที่คุณได้รับในเซสชัน tty หรือด้วยbash -l) มันถูกละเว้นโดยเชลล์ที่ไม่ได้ล็อกอินซึ่งเทอร์มินัลส่วนใหญ่รัน

ดูหน้าคู่มือของ bash (1) ภายใต้ "INVOCATION" เพื่อดูรายละเอียดเพิ่มเติม


หากคุณไม่ต้องการที่จะเก็บประวัติถาวรเพียงล้างหรือชุดHISTFILE HISTFILE=/dev/nullการทำเช่นนี้จะเป็นการยกเลิกประวัติเมื่อออกโดยอัตโนมัติในขณะที่ยังคงสามารถเก็บไว้สำหรับเชลล์ปัจจุบัน ( HISTSIZE=100)

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