बताएं कि .bash_logout कमांड क्यों नहीं चलाएंगे?


11

इसलिए मैं सोच रहा था कि हर बार कोड की इन दो पंक्तियों को चलाने के लिए मैं टर्मिनल का एक खुला उदाहरण कैसे बंद करूं:

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

मैं export HISTFILE=5स्टार्टअप पर हूं , लेकिन अभी भी जब मैं काम कर रहा हूं, तब इसे बाहर करना चाहता हूं।

मैं कुछ स्थानों में एक बिट के आसपास देखने की कोशिश की है , और ज्यादा किस्मत नहीं थी

मैं लिनक्स मिंट चलाता हूं, और यहां यह भी नोट करूंगा कि मैं इसी तरह के मुद्दे के साथ भाग गया .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

मैंने इस स्क्रिप्ट को कई तरीकों से फिर से व्यवस्थित करने की कोशिश की है, मुझे यकीन नहीं है कि अगर मुझे समझ नहीं आता कि कैसे काम करता है, और अगर इनमें से कोई भी पहली जगह पर चल रहा है। तथ्य यह है कि मैं चलाने के Xserverbash टर्मिनल कुछ है कि बाहर निकलने पर एक लॉग-आउट नहीं है पर विचार करें?

यह कहता है कि मैं लॉग इन नहीं हूं , जिससे समझ में आएगा:

$> shopt login_shell
login_shell     off

एक सामान्य टिप्पणी के रूप में, यदि आप जांच कर रहे हैं कि शेल कॉन्फिग स्क्रिप्ट चल रही है या नहीं, तो मैं आपको echoकमांड को शुरू में रखने की सलाह देता हूं , इससे पहले कि यह कुछ और करता है जो कि रनिंग के साथ हस्तक्षेप कर सकता है echo। एक त्रुटि के कारण स्क्रिप्ट समाप्त होने से पहले ही बाहर निकल सकती है।
क्रिस पेज

मैं इस तरह से यह अनुमान लगा रहा था, और यह तथ्य कि आप SHLVL = 1 के लिए जाँच कर रहे हैं, कि आपने पहले ही सत्यापित कर लिया है कि यह एक लॉगिन शेल है। क्या यह? क्या shopt login_shellकहता है?
क्रिस पेज

जवाबों:


25

यह मान कर कि आपने लॉगिन शेल ( shopt login_shell):

~ / .bash_logout केवल तभी चलाया जाता है यदि आप कमांड प्रॉम्प्ट पर एंड-टू-फ़ाइल दर्ज करने के लिए नियंत्रण-डी टाइप करके या exitउसके साथ शेल से स्पष्ट रूप से बाहर निकलते हैं logout। यदि आप टर्मिनल एमुलेटर को बंद करते हैं, तो प्रक्रियाओं को SIGHUP भेजा जाता है, और बैश उस स्थिति में ~ / .bash_logout नहीं चलता है।

यदि आप किसी भी समय काम से बाहर निकलना चाहते हैं (और यह लॉगिन शेल है या नहीं), उपयोग करें trap foo EXIT। ऐसा करने का सबसे सुविधाजनक तरीका अपने कोड को शेल फ़ंक्शन में रखना है, जैसे:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
मुझे लगता है कि मेरे बुरे सवाल पर पूरी तरह से एक अच्छी समस्या है। मैं फिर से पूछूंगा कि क्या मुझे आपका पहला वाक्य मिला है और अभी भी परेशानी है। शीश।
दरोगाओं

6

~/.bash_logoutकेवल एक लॉगिन शेल द्वारा चलाया जाता है (जैसे कि आप जो ट्टी सेशन पर प्राप्त करते हैं, या साथ में bash -l)। इसे गैर-लॉगिन शेल द्वारा अनदेखा किया जाता है, जो अधिकांश टर्मिनल चलते हैं।

आगे के विवरण के लिए, "आमंत्रण" के तहत बैश (1) का मैनुअल पेज देखें।


यदि आप लगातार इतिहास नहीं रखना चाहते हैं, तो बस परेशान HISTFILE, या सेट करें HISTFILE=/dev/null। यह स्वचालित रूप से बाहर निकलने पर इतिहास को छोड़ देगा, जबकि अभी भी इसे वर्तमान शेल ( HISTSIZE=100) के लिए रखा जा सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.