मैं वर्तमान कार्यशील निर्देशिका को बदलने के लिए एक स्क्रिप्ट चलाना चाहता हूं:
#!/bin/bash
cd web/www/project
लेकिन, मैं इसे चलाने के बाद, वर्तमान pwd अपरिवर्तित रहता है! मैं उसे कैसे कर सकता हूँ?
मैं वर्तमान कार्यशील निर्देशिका को बदलने के लिए एक स्क्रिप्ट चलाना चाहता हूं:
#!/bin/bash
cd web/www/project
लेकिन, मैं इसे चलाने के बाद, वर्तमान pwd अपरिवर्तित रहता है! मैं उसे कैसे कर सकता हूँ?
जवाबों:
यह एक अपेक्षित व्यवहार है, और पहले से ही कई बार चर्चा की गई है।
स्क्रिप्ट एक सबशेल में चलाई जाती है, और मूल शेल कार्यशील निर्देशिका को परिवर्तित नहीं कर सकती है। इसके खत्म होने पर इसके प्रभाव खत्म हो जाते हैं।
निर्देशिका को स्थायी रूप से बदलने के लिए आपको स्क्रिप्ट का स्रोत बनाना चाहिए , जैसे कि
. ./script
source ./script
ही?
.
और source
बैश में बराबर हैं। 2. हम ./
फ़ाइल नाम से पहले उपयोग करने की जरूरत नहीं है अगर यह एक ही निर्देशिका में है। यह केवल चलाने के लिए ठीक है:. script
इस तरह के छोटे कार्यों के लिए, स्क्रिप्ट बनाने के बजाय, इस तरह से एक उपनाम बनाएं,
$ alias cdproj='cd /dir/web/www/proj'
आपको इसे अपनी .bashrc
फ़ाइल में जोड़ना चाहिए , अगर आप इसे हर इंटरेक्टिव शेल के लिए सेट करना चाहते हैं।
अब आप इसे इस रूप में चला सकते हैं $ cdproj
।
eval `./script`
या eval $(./script)
निष्पादित करने के लिए कर सकते हैं। यह उन कमांड के लिए एक सामान्य दृष्टिकोण है, जिन्हें इनवॉइसिंग शेल के वातावरण को अपडेट करने की आवश्यकता है।
eval
अप्रोच करने जा रहे हैं तो बस इस बात का विशेष ध्यान रखें कि आप क्या आउटपुट करते हैं ।
exec bash
अंत में उपयोग करेंएक बैश स्क्रिप्ट अपने वर्तमान परिवेश में या अपने बच्चों पर संचालित होती है, लेकिन अपने मूल वातावरण पर नहीं।
हालाँकि, यह प्रश्न अक्सर पूछा जाता है क्योंकि कोई अन्य निर्देशिका के माध्यम से एक बैश स्क्रिप्ट के निष्पादन के बाद एक निश्चित निर्देशिका में बैश प्रॉम्प्ट पर छोड़ दिया जाना चाहता है ।
यदि यह स्थिति है, तो स्क्रिप्ट के अंत में बस एक बच्चा बैश उदाहरण निष्पादित करें:
#!/usr/bin/env bash
cd desired/directory
exec bash
यह एक नया सबस्क्रिप्शन बनाता है। exit
पहले शेल पर लौटने के लिए टाइप करें, जहां स्क्रिप्ट शुरू में शुरू की गई थी।
exec
बेहतर है कि आमतौर पर एक बदमाश का अंतिम सहारा माना जाता है .. :)
exit
(या Ctrl + D) सत्र को सफाई से समाप्त करने का प्रयास करते हैं, तो आपको वह 11 से 21 बार करना होगा। (2) एक निष्पादन योग्य स्क्रिप्ट का उपयोग करने का एक और दोष यह है कि, यदि आप अपने इंटरैक्टिव शेल सत्र में कोई शेल विकल्प (जैसे, dotglob
या globstar
) सेट करते हैं, तो आप उन्हें खो देंगे, क्योंकि आप एक नया शेल शुरू कर रहे हैं।
हालांकि ऐसे उत्तर हैं जो आप चाहते हैं कि सटीक कार्रवाई करें, इस तरह के उद्देश्य के लिए एक अधिक मानक तरीका प्रतीकात्मक लिंक बनाना है:
ln -s ~/web/www/project proj #use full path to dir!
फिर आप cd
नाम का उपयोग करके निर्देशिका में जा सकते हैं proj
:
cd proj
यह विधि अधिक लचीली है क्योंकि आप बिना संक्षिप्त नाम का उपयोग किए फ़ाइलों को एक्सेस कर सकते हैं cd
:
ls proj/ #note the endslash!
vim proj/file.x
निर्भर करता है कि आप क्या करने जा रहे हैं, एक और समाधान स्क्रिप्ट के बजाय एक फ़ंक्शन बना सकता है।
उदाहरण:
एक फ़ाइल में एक समारोह बनाएँ, चलो कहते हैं /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
फिर अपने में शामिल bashrc
या zshrc
फ़ाइल:
# Somewhere in rc file
source /home/aidin/my-cd-script
अब आप इसे कमांड की तरह उपयोग कर सकते हैं:
$ my-cd
क्यों नहीं "निष्पादित" का उपयोग करें यह बिल्कुल वही करता है जो मैं चाहता हूं।
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(या Ctrl + D) सत्र को सफाई से समाप्त करने का प्रयास करते हैं, तो आपको वह 11 से 21 बार करना होगा।
dotglob
या globstar
) सेट करते हैं, तो आप उन्हें खो देंगे, क्योंकि आप एक नया शेल शुरू कर रहे हैं। … (Cont'd)
आप ऐसा कर सकते हैं कि फ़ंक्शन का उपयोग करके && उदाहरण bellow Zabbix स्थापित करता है और इसके अंदर एक पंक्ति के साथ एक फ़ाइल बनाता है।
उदाहरण के लिए:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
या:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
स्क्रिप्ट से बचने के लिए इस तरह से उपयोग करना चाहिए , न किexit
- वे शेल फ़ंक्शंस की तरह हैं, औरexit
वह स्क्रिप्ट से बाहर निकलने वाले शेल से बाहर निकल जाएगा।