वर्तमान निर्देशिका को बदलने के लिए स्क्रिप्ट (सीडी, पीडीडब्ल्यू)


44

मैं वर्तमान कार्यशील निर्देशिका को बदलने के लिए एक स्क्रिप्ट चलाना चाहता हूं:

#!/bin/bash
cd web/www/project

लेकिन, मैं इसे चलाने के बाद, वर्तमान pwd अपरिवर्तित रहता है! मैं उसे कैसे कर सकता हूँ?

जवाबों:


63

यह एक अपेक्षित व्यवहार है, और पहले से ही कई बार चर्चा की गई है।

स्क्रिप्ट एक सबशेल में चलाई जाती है, और मूल शेल कार्यशील निर्देशिका को परिवर्तित नहीं कर सकती है। इसके खत्म होने पर इसके प्रभाव खत्म हो जाते हैं।

निर्देशिका को स्थायी रूप से बदलने के लिए आपको स्क्रिप्ट का स्रोत बनाना चाहिए , जैसे कि

. ./script

8
@Sony: ध्यान दें कि आपको returnस्क्रिप्ट से बचने के लिए इस तरह से उपयोग करना चाहिए , न कि exit- वे शेल फ़ंक्शंस की तरह हैं, और exitवह स्क्रिप्ट से बाहर निकलने वाले शेल से बाहर निकल जाएगा।
चार्ल्स स्टीवर्ट

@CharlesStewart वास्तव में, मैं खट्टे लिपियों से परिचित नहीं हूँ। धन्यवाद!
सोनी संतोस

5
है source ./scriptही?
अमायसन

2
@ संयम: हाँ, यह है
enzotib

2
1. .और sourceबैश में बराबर हैं। 2. हम ./फ़ाइल नाम से पहले उपयोग करने की जरूरत नहीं है अगर यह एक ही निर्देशिका में है। यह केवल चलाने के लिए ठीक है:. script
sobi3ch

19

इस तरह के छोटे कार्यों के लिए, स्क्रिप्ट बनाने के बजाय, इस तरह से एक उपनाम बनाएं,

$ alias cdproj='cd /dir/web/www/proj'

आपको इसे अपनी .bashrcफ़ाइल में जोड़ना चाहिए , अगर आप इसे हर इंटरेक्टिव शेल के लिए सेट करना चाहते हैं।

अब आप इसे इस रूप में चला सकते हैं $ cdproj


1
आप स्क्रिप्ट को निष्पादित करने के लिए आदेश भी प्रतिध्वनित कर सकते हैं, और फिर उन आदेशों का उपयोग eval `./script` या eval $(./script)निष्पादित करने के लिए कर सकते हैं। यह उन कमांड के लिए एक सामान्य दृष्टिकोण है, जिन्हें इनवॉइसिंग शेल के वातावरण को अपडेट करने की आवश्यकता है।
कीथ थॉम्पसन

2
यदि आप evalअप्रोच करने जा रहे हैं तो बस इस बात का विशेष ध्यान रखें कि आप क्या आउटपुट करते हैं ।
jw013

13

exec bashअंत में उपयोग करें

एक बैश स्क्रिप्ट अपने वर्तमान परिवेश में या अपने बच्चों पर संचालित होती है, लेकिन अपने मूल वातावरण पर नहीं।

हालाँकि, यह प्रश्न अक्सर पूछा जाता है क्योंकि कोई अन्य निर्देशिका के माध्यम से एक बैश स्क्रिप्ट के निष्पादन के बाद एक निश्चित निर्देशिका में बैश प्रॉम्प्ट पर छोड़ दिया जाना चाहता है ।

यदि यह स्थिति है, तो स्क्रिप्ट के अंत में बस एक बच्चा बैश उदाहरण निष्पादित करें:

#!/usr/bin/env bash
cd desired/directory
exec bash

यह एक नया सबस्क्रिप्शन बनाता है। exitपहले शेल पर लौटने के लिए टाइप करें, जहां स्क्रिप्ट शुरू में शुरू की गई थी।


स्क्रिप्ट को बेहतर स्रोत के रूप में स्वीकार किए गए उत्तर में: execबेहतर है कि आमतौर पर एक बदमाश का अंतिम सहारा माना जाता है .. :)
न्यूरोनैट

1
यह ट्रिक डेबियन ९ स्ट्रेच में काम नहीं करती है।
vdegenne

3
इस बारे में जाने का यह गलत तरीका है!
डेनिस विलियमसन

3
चूंकि किसी ने इसके साथ समस्याओं को विस्तृत नहीं किया है (मैं आपको देख रहा हूं, @ डेनिस): (1) हर बार जब आप इसे चलाते हैं, तो यह एक नई, लगातार बैश प्रक्रिया बनाता है। इसे एक सत्र में दस या बीस बार करें, और आपके पास 11 से 21 बैश प्रक्रियाएँ होंगी। यह प्रदर्शन को प्रभावित कर सकता है, और, यदि आप टाइप करके exit(या Ctrl + D) सत्र को सफाई से समाप्त करने का प्रयास करते हैं, तो आपको वह 11 से 21 बार करना होगा। (2) एक निष्पादन योग्य स्क्रिप्ट का उपयोग करने का एक और दोष यह है कि, यदि आप अपने इंटरैक्टिव शेल सत्र में कोई शेल विकल्प (जैसे, dotglobया  globstar) सेट करते हैं, तो आप  उन्हें खो देंगे, क्योंकि आप एक नया शेल शुरू कर रहे हैं।
जी-मैन का कहना है 'मोनिका'

1
बहुत अच्छा समाधान! मैंने अपने उपनाम को bash_profile में फिर से लिखा है इसलिए यह एक अलग फ़ाइल में संग्रहीत स्क्रिप्ट है। मैं नए बनाए गए अस्थायी फ़ोल्डर में जाने के लिए स्क्रिप्ट का उपयोग करता हूं। और अब अस्थायी बैश सत्र होना और भी आसान है। कार्रवाई में एसआरपी! धन्यवाद!
artyom.razinov

8

हालांकि ऐसे उत्तर हैं जो आप चाहते हैं कि सटीक कार्रवाई करें, इस तरह के उद्देश्य के लिए एक अधिक मानक तरीका प्रतीकात्मक लिंक बनाना है:

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


4

निर्भर करता है कि आप क्या करने जा रहे हैं, एक और समाधान स्क्रिप्ट के बजाय एक फ़ंक्शन बना सकता है।

उदाहरण:

एक फ़ाइल में एक समारोह बनाएँ, चलो कहते हैं /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

0

क्यों नहीं "निष्पादित" का उपयोग करें यह बिल्कुल वही करता है जो मैं चाहता हूं।

#!/bin/bash

cd someplace
exec bash

~/someplace

1
चीजें हैं जो से सावधान रहें लगते हैं कि आप क्या चाहते हो। (एक विशाल लकड़ी का घोड़ा! बस जो मैं चाहता था!) ​​हर बार जब आप इसे चलाते हैं, तो यह एक नई, लगातार बैश प्रक्रिया बनाता है। इसे एक सत्र में दस या बीस बार करें, और आपके पास 11 से 21 बैश प्रक्रियाएँ होंगी। यह प्रदर्शन को प्रभावित कर सकता है, और, यदि आप टाइप करके exit(या Ctrl + D) सत्र को सफाई से समाप्त करने का प्रयास करते हैं, तो आपको वह 11 से 21 बार करना होगा।
जी-मैन का कहना है कि 'मोनिका' की बहाली

मैं निश्चित रूप से देख सकता हूं कि समस्या कहां होगी। मेरे लिए हालांकि मैं इसे एक बार उपयोग कर रहा हूं, मुझे जो काम चाहिए और फिर बाहर निकल रहा है। यदि मैं एकमात्र दोष है जिसके साथ मैं रह सकता हूं। दूसरी ओर अगर कोई बेहतर उपाय है, तो मैं इसे देखने के लिए तैयार हूं।
पाउल

इस सवाल का ऐडिन का जवाब , शेल फ़ंक्शन का उपयोग करना, और सचिन दिवेकर का जवाब , एक उपनाम का उपयोग करना, (IMO) स्क्रिप्ट का उपयोग करने से बेहतर समाधान हैं। PS स्क्रिप्ट का उपयोग करने का एक और दोष यह है कि, यदि आप कोई शेल विकल्प (जैसे, dotglobया  globstar) सेट करते हैं, तो आप  उन्हें खो देंगे, क्योंकि आप एक नया शेल शुरू कर रहे हैं। … (Cont'd)
जी-मैन ने कहा कि मोनिका की बहाली

(जारी) ... पी पी एस मैं सिर्फ देखा है कि आप कर रहे हैं, मूल रूप से, दोहराया सर्ज Stroobandt के जवाब और कह रही है '' ऐसा करने क्यों नहीं? '' पर  स्टैक एक्सचेंज हम नए विचारों और / या जानकारी प्रदान करने के जवाब की उम्मीद, और बस पर चर्चा नहीं अन्य जवाब।
जी-मैन ने कहा कि 'पुनः स्थापित मोनिका'

-1

आप ऐसा कर सकते हैं कि फ़ंक्शन का उपयोग करके && उदाहरण 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.