~ / .Bash_login का उपयोग करके लॉगिन पर एक स्क्रिप्ट चलाएँ


15

जब मैं अपने उबंटू में लॉगिन और लॉगआउट करता हूं तो मुझे एक स्क्रिप्ट चलाने की आवश्यकता होती है।

मैंने स्क्रिप्ट को अपने में रखने की कोशिश की ~/.bash_loginलेकिन यह काम नहीं किया।

क्या कोई बेहतर स्थान है जहां मैं अपनी स्क्रिप्ट चला सकता हूं?

मेरी स्क्रिप्ट स्थित है /home/gsd/script/login.shऔर यह निष्पादन योग्य है।

संपादित करें:

जब मैं टाइप करता हूं तो मेरी स्क्रिप्ट चलती है: /home/gsd/script/login.shऔर यह + x के साथ सेट होती है

अब, मैं केवल है: touch /home/gsd/test.txtमें ~/.bash_loginपरीक्षण करने के लिए।

फ़ाइल test.txt कभी नहीं बनाया गया है

2 संपादित करें:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc

क्या .bash_login के पास सही अनुमतियां हैं? ls -l .bash_login क्या देता है?
santiagozky

क्या आपके पास भी है ~/.bash_profile?
enzotib

-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
गीनो सुलिवन

1
chmod +x .bash_login
जोक

1
यह आवश्यक नहीं है chmod +x .bash_login(.bash_login पर निष्पादन योग्य बिट सेट करें)। बैश मैनुअल इस क्षेत्र में थोड़ा भ्रमित है, लेकिन बैश शेल स्क्रिप्ट की तरह ईएक्सक्यूट .bash_login नहीं करता है। यह फ़ाइल को पढ़ता है और फिर इसके भीतर कमांड्स निष्पादित करता है (आप रनिंग के द्वारा भी कुछ ऐसा ही कर सकते हैं source ~/.bash_login)।
स्टीफन लासिवस्की

जवाबों:


20

यदि .bash_profile मौजूद है, तो बैश नहीं पढ़ा जाएगा। bash_login (या .profile)। यह कष्टप्रद विशेषता बाश मैनुअल के कुछ संस्करणों में वर्णित है, लेकिन सभी नहीं।

.bash_profileऔर .bash_loginअनुरूप हैं, इसलिए मैं आपको अपने आदेशों को रखने की सलाह देता हूं .bash_profile, क्योंकि यह आमतौर पर उपयोग किया जाता है और .bash_loginअपेक्षाकृत अज्ञात है। इसके .bashrcबजाय अपने आदेशों को रखने पर विचार करें .bash_profile। मैनुअल "इंटरएक्टिव गैर-लॉगिन शेल" और "इंटरेक्टिव लॉगिन शेल" के बीच अंतर का वर्णन करता है, इसलिए उस अनुभाग को पढ़ना सुनिश्चित करें।

GNU बैश संदर्भ मैनुअल संस्करण 4.1: बैश स्टार्टअप फाइल्स कहती हैं:

उस क्रम में ~ / .bash_profile, ~ / .bash_login, और ~ / .profile दिखता है, और पहले वाले से कमांड पढ़ता और निष्पादित करता है जो मौजूद है और पठनीय है।

सुपरसुअर पर इस प्रश्न को भी देखें , और इस बैश हाउटो (डब्लू डोंट फ्रॉम द फ्रीस्टिक्स.डंडन्स डॉट ओआरजी_8088 पता --- यह अभी भी एक अच्छी गुणवत्ता वाला मैनुअल है और मैंने इसे सालों से इस्तेमाल किया है)।

अपडेट करें , क्योंकि आप कहते हैं कि आपके पास .bash_profile नहीं है।

ऐसा लगता है कि आप इसका उपयोग नहीं कर रहे हैं जिसे "इंटरैक्टिव गैर-लॉगिन शेल" कहा जाता है (विस्तृत विवरण के लिए बैश मैनुअल देखें)।

यह परीक्षण करने के लिए निम्न प्रत्येक फ़ाइल की तरह कुछ जोड़ें: .bashrc, .bash_profileऔर .bash_login

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

फिर लॉग आउट करें और फिर से लॉग इन करें। जब आप लॉग इन करते हैं, तो मैं शर्त लगाता हूं कि आप केवल "DEBUG: I am .bashrc" वाक्यांश देखेंगे, लेकिन "I am .bash_profile" नहीं। यदि हां, तो इसका मतलब है कि आप "इंटरएक्टिव नॉन-लॉगिन शेल" हैं, जिसका सीधा सा मतलब है कि बैश कॉल करेगा .bashrcलेकिन नहीं .bash_profile। जानकारी के लिए कि ये डॉटफ़ाइल्स वे क्यों हैं, नीचे @Andrejs Cainikovs की पोस्ट देखें और http://mywiki.wooledge.org/DotFiles


मैंने अपना प्रश्न अपडेट किया है, मेरे पास bash_profile नहीं है
गीनो सुलिवन

ठीक है, क्योंकि पहले आपने कहा था "हाँ मेरे पास एक बैश प्रोफ़ाइल है"।
स्टीफन लासिवस्की

हां, मेरे पास यह तब था लेकिन इसे हटा दिया गया था
गीनो सुलिवन

3
यह उत्तर समस्या को हल करता है, मुझे लगता है कि यह इसे स्वीकार करने लायक है।
मारियस बुटिक

1
यह भी ध्यान दें कि ये बैश फाइलें केवल शेल (टर्मिनल, ssh, आदि के माध्यम से) में लॉग इन करते समय चलती हैं, न कि GUI में लॉग इन करते समय!
k

6

लॉगिन गोले, भले ही वे इंटरैक्टिव या गैर-इंटरैक्टिव पढ़ें और निष्पादित करें.profile

इंटरैक्टिव गोले पढ़ते हैं और निष्पादित करते हैं .bashrc

अक्सर आप उस /etc/profileस्रोत को देखेंगे .bashrc- इस तरह से की गई सभी सेटिंग्स .bashrcएक लॉगिन शेल में भी प्रभावी होंगी, भले ही यह इंटरएक्टिव हो या नॉन-इंटरेक्टिव।

शेल के लिए इनिशियलाइज़ेशन स्क्रिप्ट के निष्पादन का क्रम इस बात पर निर्भर करता है कि शेल इंटरएक्टिव या नॉन-इंटरेक्टिव है और यह संबंधित नहीं है कि यह लॉगिन स्क्रिप्ट है या नहीं।

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में लागू किया जाता है, तो यह पढ़ता है और से कमांड निष्पादित करता है /etc/profile। तब बैश तब केवल पहली फ़ाइल मौजूद है और निम्नलिखित में से पठनीय है, निष्पादित करने के लिए प्रयास करेंगे:

  1. .bash_profile
  2. .bash_login
  3. .profile

यदि इनमें से कोई एक फ़ाइल मिली है, लेकिन पढ़ी नहीं जा सकती है, तो यह त्रुटि का कारण बनेगी। कोई त्रुटि नहीं है अगर कोई नहीं मिला है।

इस प्रक्रिया का पालन तब किया जाता है जब --loginविकल्प के साथ एक गैर-संवादात्मक लॉगिन शैल लागू किया जाता है ।


1
AFAIK, .profileफ़ाइल तभी पढ़ी और निष्पादित की जाती है जब उपयोगकर्ता ग्राफ़िकल इंटरफ़ेस का उपयोग करके लॉग इन करता है। अन्यथा यह पढ़ा नहीं जाता है।
राजाविरवर्मा

@ राजरावीवर्मा मैं अभी (उबंटू 16.04) का परीक्षण किया और ~/.profileनिश्चित रूप से गैर-ग्राफ़िकल लॉगिन गोले में पढ़ा गया है (मैंने दूसरे टर्मिनल पर स्विच Ctrl+Alt+F2करके और वहाँ लॉग इन करके परीक्षण किया )।
18

मैं @ राजरावी वर्मा से सहमत हूं - मैं एसएसएच पर एक उबंटू 16.04 वीएम में लॉग इन कर रहा हूं और .profileपढ़ा नहीं जा रहा है, केवल.bashrc
जुमेश

0

सुनिश्चित करें कि जिस स्क्रिप्ट को आप चलाना चाहते हैं, वह निष्पादन योग्य है। chmod +x scriptnameऐसा करने के लिए भागो । यह भी सुनिश्चित करें कि स्क्रिप्ट सही शेबंग ( #!/bin/bashशेल स्क्रिप्ट के लिए) से शुरू होती है । अन्त में, सभी पूर्ण पथ जब यह क्रियान्वित करने, जैसे, का उपयोग /usr/bin/echoकरने के बजाय echoसिर्फ बैठाना वातावरण है कि अपनी स्क्रिप्ट में निष्पादित करेंगे कोई भी आप पर उपयोग किया जाता है के समान नहीं है।


0

बैश केवल .bash_loginया .profileफ़ाइलों के लिए दिखता है अगर इसे इंटरैक्टिव लॉगिन शेल के रूप में निष्पादित किया जाता है। जब इसे इंटरेक्टिव नॉन-लॉगिन शेल के रूप में निष्पादित किया जाता है तो यह पढ़ता है .bashrc
आमतौर पर यह दूसरा मामला है, जब आप gnome-terminalबैश चलाते हैं तो गैर-लॉगिन शेल के रूप में चलाया जाता है।

यह स्पष्ट रूप से बताता है कि यदि आप सूक्ति में बूट कर रहे हैं, .bash_loginतो निष्पादित नहीं किया जाएगा। लेकिन अगर आप रनवेवेल को सीधे बूट करने के लिए बूट करते हैं, तो उसी फ़ाइल को succesfull लॉगिन पर निष्पादित किया जाएगा।
मुझे लगता है .bash_loginकि दूरस्थ एसएसएच कनेक्शन के मामले में भी निष्पादित किया जाएगा।

आंशिक रूप से यहां से फट गया ।

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