.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

আমি এই স্ক্রিপ্টটি অনেকভাবে পুনরায় সাজানোর চেষ্টা করেছি, বাশ কীভাবে কাজ করে তা আমি বুঝতে না পারছি কিনা তা নিশ্চিত নই এবং এর কোনওটি যদি প্রথম স্থানে চলছে। আমি Xserverব্যাশ চালানোর ফলে টার্মিনালটিকে এমন কিছু বিবেচনা করা হয় যা প্রস্থান করার সময় লগ-আউট নয়?

এটি বলে যে আমি লগইন করছি না , যা বোঝা যাবে:

$> shopt login_shell
login_shell     off

একটি সাধারণ মন্তব্য হিসাবে, আপনি যদি শেল কনফিগারেশন স্ক্রিপ্টটি চালিত হচ্ছে কিনা তা পরীক্ষা করে নিচ্ছেন, আমি সুপারিশ করছি আপনাকে echoশুরুতে কমান্ডটি রাখার আগে, এটি echoরান করার ক্ষেত্রে হস্তক্ষেপ করতে পারে এমন আরও কিছু করার আগে । কোনও ত্রুটি স্ক্রিপ্টটি শেষ হওয়ার আগেই প্রস্থান করতে পারে।
ক্রিস পেজ

আপনি যেভাবে এই শব্দটি বানিয়েছেন আমি তা ধরে নিয়েছি এবং আপনি SHLVL = 1 যাচাই করে দেখছেন, আপনি এটি ইতিমধ্যে যাচাই করেছেন যে এটি লগইন শেল। তাই কি? কি shopt login_shellবলে?
ক্রিস পেজ

উত্তর:


25

ধরে নিলাম আপনি যাচাই করেছেন যে এটি লগইন শেল ( shopt login_shell):

you / .bash_logout কেবল তখনই চালিত হয় যদি আপনি স্পষ্টভাবে শেলটি দিয়ে exitবা প্রস্থান করে বা logoutকমান্ড প্রম্পটে ফাইল-এর শেষে প্রবেশ করতে কন্ট্রোল-ডি টাইপ করুন। আপনি যদি টার্মিনাল এমুলেটরটি বন্ধ করেন, প্রসেসগুলি SIGHUP প্রেরণ করা হয়, এবং ব্যাশ সেই ক্ষেত্রে ~ / .bash_logout চালায় না।

যদি আপনি কোনও কাজ সম্পাদন করতে চান যে কোনও সময় বাশ প্রস্থান করে (এবং এটি লগইন শেল হোক বা না হোক), ব্যবহার করুন trap foo EXIT। এটি করার সর্বাধিক সুবিধাজনক উপায় হ'ল আপনার কোডটি শেল ফাংশনটিতে রাখা, যেমন:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
আমার খারাপ প্রশ্নে আমি নষ্ট হয়ে যাওয়ার মতো পুরোপুরি ভাল সমস্যার মতো বোধ করি। আমি আবার জিজ্ঞাসা করব যদি আমি আপনার প্রথম বাক্যটি পেরেছি এবং এখনও সমস্যা আছে। Sheesh।
ড্রোগানস

6

~/.bash_logoutকেবলমাত্র একটি লগইন শেল দ্বারা চালিত হয় (যেমন আপনি টিটি সেশনগুলিতে যাবেন বা তার সাথে bash -l)। এটি লগ-ইন শেল দ্বারা উপেক্ষা করা হয়, যা বেশিরভাগ টার্মিনালগুলি চালিত হয়।

আরও তথ্যের জন্য "ইনভোকেশন" এর অধীনে ব্যাশের ম্যানুয়াল পৃষ্ঠা দেখুন (1)।


আপনি যদি অবিরাম ইতিহাস রাখতে চান না, কেবল আনসেট করুন HISTFILEবা সেট করুন HISTFILE=/dev/null। এটি স্বয়ংক্রিয়ভাবে প্রস্থান করার সময় ইতিহাসটিকে বাতিল করে দেবে, তবুও এটি বর্তমান শেল ( HISTSIZE=100) এর জন্য রাখার অনুমতি দেয় ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.