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