सफलतापूर्वक एक शेल स्क्रिप्ट से .bashrc स्रोत नहीं हो सकता


51

आम तौर पर हम ~/.bashrcइस कमांड का उपयोग करके फाइल कर सकते हैं

source ~/.bashrc

लेकिन अगर मैं इसे शेल स्क्रिप्ट में लिखता हूं और इसे निष्पादित करता हूं, तो कुछ भी नहीं होता है। क्यों?
क्या इसे करने का कोई तरीका है?

मेरी स्क्रिप्ट:

#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc

इसके .बजाय (डॉट) की कोशिश की source। एक ही परिणाम।

जवाबों:


26

एक शेल स्क्रिप्ट अपने स्वयं के शेल इंस्टेंस में चलाया जाता है। सभी परिवर्तनीय सेटिंग्स, फ़ंक्शन परिभाषाएं और ऐसे केवल इस उदाहरण (और शायद उसके बच्चों) को प्रभावित करते हैं, लेकिन कॉलिंग शेल नहीं, इसलिए वे स्क्रिप्ट समाप्त होने के बाद चले जाते हैं।

इसके विपरीत sourceकमांड एक नया शेल इंस्टेंस शुरू नहीं करता है लेकिन वर्तमान शेल का उपयोग करता है ताकि परिवर्तन बने रहें।

यदि आप अपना शॉर्टकट पढ़ना चाहते हैं तो .bashrc शेल स्क्रिप्ट के बजाय शेल फ़ंक्शन या अन्य उपनाम का उपयोग करें, जैसे

alias brc='source ~/.bashrc'

आपके त्वरित उत्तर के लिए धन्यवाद। आपका समाधान शायद काम करे लेकिन मुझे 'aliac brc = ....' लाइन को बचाने के लिए मैन्युअल रूप से bashrc फाइल को एडिट करना होगा। मैं पर्यावरण चर को बदलने के लिए एक गुई विकसित करने की कोशिश कर रहा हूं। इसलिए मैं दूसरे कंप्यूटर की bashrc फ़ाइल को मैन्युअल रूप से संपादित नहीं कर सकता।
शांतनु 15

1
आपको source ~/.bashrcउस शेल में भागना होगा , जिसमें आप पर्यावरण को बदलना चाहते हैं। आप इसे दूसरी प्रक्रिया से नहीं बदल सकते। हो सकता है कि (विश्व स्तर पर) इस उपनाम को जोड़ना आपके GUI की स्थापित प्रक्रिया का एक हिस्सा हो।
फ्लोरियन डिस्च

1
तो क्या मैं आपके उपनाम को पहले स्क्रिप्ट में डाल देता हूं और फिर brc का आह्वान करता हूं जब मैं अपने .bashrc को स्रोत बनाना चाहता हूं या मुझे उस अलियास कमांड को किसी फाइल में डालने की आवश्यकता है?
user137717

मैंने जो किया, वह फ्लोरियन डिस्च के उत्तर का विस्तार है। आप बस एक बहु-पंक्ति उपनाम का उपयोग कर सकते हैं: अन्य उपनाम brc = 'chmod a + x ~ / .bashrc; source ~ / .bashrc 'मैं अभी भी बहुत नया हूं, इसलिए मुझे यकीन नहीं है कि इसे' खराब प्रैक्टिस 'माना जाए। हालांकि यह काम करता है।
a_user_appears

13

आपका .bashrcआमतौर पर शुरू होता है:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

चूंकि आपकी स्क्रिप्ट में PS1 सेट नहीं है (क्योंकि यह इंटरैक्टिव नहीं है), यह पथ को रीसेट नहीं करता है क्योंकि यह जल्दी बाहर निकलता है। अपनी स्क्रिप्ट को प्रदर्शित करने के लिए, संशोधित करें:

    #!/bin/bash
    chmod a+x ~/.bashrc
    PS1='$ '
    source ~/.bashrc

अब यह आपकी स्क्रिप्ट को नए के साथ काम करने की अनुमति देगा .bashrc। नोट: एक बार जब आपकी स्क्रिप्ट बाहर निकल जाती है, तो env को स्क्रिप्ट शुरू करने से पहले सेट किया जाएगा। अगली बार एक टर्मिनल शुरू होने पर परिवर्तन परिलक्षित होंगे।


कम से कम 16.04 और शायद इससे पहले, डिफ़ॉल्ट उबंटू .bashrcयह जांचने के लिए अधिक विश्वसनीय तरीके का उपयोग करता है कि शेल इंटरैक्टिव है। /etc/bash.bashrcअभी भी PS1 परीक्षण है।
ज़न्ना

12

प्रयत्न, कोशिश:

exec bash

इसे ~ / .bashrc, ~ / .bash_aliases, आदि को पुनः लोड करना चाहिए।


9
यह वर्तमान बैश प्रक्रिया को एक नए के साथ बदल देता है। यह उपयोग करने की तुलना में बहुत कम या आसान नहीं है, sourceलेकिन किसी भी चर को नष्ट कर देता है और इस तरह से उपयोगकर्ता ने मैन्युअल रूप से सेट किया है - जो आप चाहते हैं या नहीं हो सकता है।
फ्लोरियन डिस्च

पकड़ के संदर्भ में, bashrc सोर्सिंग के बाद अन्य कमांड्स के साथ शेल स्क्रिप्ट के संदर्भ में, क्या आप उन कमांड्स को डालते हैं, जिन्हें नए bash स्टेट की आवश्यकता होती है exec bash, जिस तरह से मैं इसे कमांड के बाद समझता हूं वह पहले की तरह ही bash सेटिंग में रहेगा?
10

11

मैं रावी के जवाब को पूरक करना चाहता हूं :

यह व्यवहार उबंटू (और शायद सबसे अधिक व्युत्पन्न डिस्ट्रोस) के लिए विशिष्ट है, चूंकि आपकी डिफ़ॉल्ट ~/.bashrcफ़ाइल शॉर्ट-सर्किट, उबंटू 18.04 से शुरू होती है, उदाहरण के लिए:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

यदि यह गैर-संवादात्मक शेल में चल रहा है, तो यह फ़ाइल के मूल्यांकन को रोक देगा, जो कि आपकी स्क्रिप्ट का मामला है क्योंकि सभी स्क्रिप्ट एक गैर-इंटरैक्टिव शेल में चलाए जाते हैं , और बाद में प्रत्येक फ़ाइल आपको sourceइस संपत्ति का उत्तराधिकार देगी।

eval किराये का

मैं एक बदसूरत हैक बाहर पाया Ubuntu विशेष रूप से, के evalबजाय का उपयोग कर source:

eval "$(cat ~/.bashrc | tail -n +10)"

यह बस कुछ पहली लाइनों को छोड़ देता है और ~/.bashrcबाकी का मूल्यांकन करता है इसलिए बाकी का मूल्यांकन किया जाता है और वर्तमान निष्पादन को संशोधित करता है।

ज्ञात हो कि यह एक जादुई संख्या है और उबंटू संस्करणों में काम नहीं कर सकती है; लेकिन एक अच्छा समाधान हो सकता है यदि आप अधिक-या-कम ज्ञात प्रणालियों के लिए स्क्रिप्ट तैयार कर रहे हैं।

मूल्यांकन को रोकने वाले विशिष्ट बिट्स को लक्षित करने के लिए एक कट्टर समाधान रेगेक्स का उपयोग कर सकता है।

शेबंग विकल्प

एक अन्य विकल्प जो कुछ परिदृश्यों में बेहतर काम कर सकता है, वह स्क्रिप्ट को शेल्बैंग में एक ध्वज जोड़कर एक इंटरैक्टिव शेल में चलाने के लिए मजबूर कर रहा है :

#!/bin/bash -i

कुछ बातों से अवगत रहें:

  • यह फ़ॉर्म का उपयोग करने के लिए एक बेहतर अभ्यास है #!/usr/bin/env bashलेकिन इस तरह आप तर्कों के साथ खोल शुरू नहीं कर सकते
  • उनके उपयोग -iका परिणाम स्वयं निर्धारित है, उनमें से, प्रोग्राम उपयोगकर्ता बातचीत के लिए संकेत देंगे और यह आमतौर पर स्क्रिप्ट के लिए अभिप्रेत नहीं है, उदाहरण के लिए, debसंकुल को स्थापित करना स्क्रिप्ट को dpkg configureसंकेत पर रोक सकता है ।
  • मैंने शुरू में इस सुविधा का उपयोग करने set -iऔर set +iचालू करने की कोशिश की , जहाँ मुझे इसकी आवश्यकता थी, लेकिन यह काम नहीं करता है

2

अन्य तरीकों में से कोई भी मेरे लिए काम नहीं किया [ source /path/to/fileबनाम . ./path/to/file, उर्फ, आदि ...], इस ट्यूटोरियल के लिए धन्यवाद, मैंने पाया कि इसका उपयोग करना:

#!/usr/bin/env bash कुटिया

सरल के बजाय #!/usr/bin/envएक तर्क दुभाषिया को पारित करने देता है, जो मुझे लगता है कि यहां महत्वपूर्ण है - अधिक जानकारी के लिए इस दस्तावेज़ को देखें ।

किसी भी घटना में, यदि स्रोत किसी भी रूप में आपके लिए काम नहीं कर रहे हैं, तो अपने शेबंग की जांच करने का प्रयास करें, यह समस्या हो सकती है :)

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