मैं रावी के जवाब को पूरक करना चाहता हूं :
यह व्यवहार उबंटू (और शायद सबसे अधिक व्युत्पन्न डिस्ट्रोस) के लिए विशिष्ट है, चूंकि आपकी डिफ़ॉल्ट ~/.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चालू करने की कोशिश की , जहाँ मुझे इसकी आवश्यकता थी, लेकिन यह काम नहीं करता है ।