एक बैश स्क्रिप्ट से वर्तमान निर्देशिका को बदलें


190

क्या स्क्रिप्ट से वर्तमान निर्देशिका को बदलना संभव है?

मैं बैश में निर्देशिका नेविगेशन के लिए एक उपयोगिता बनाना चाहता हूं। मैंने एक परीक्षण स्क्रिप्ट बनाई है जो निम्नलिखित की तरह दिखती है:

#!/bin/bash
cd /home/artemb

जब मैं बैश शेल से स्क्रिप्ट निष्पादित करता हूं तो वर्तमान निर्देशिका नहीं बदलती है। क्या किसी स्क्रिप्ट से वर्तमान शेल डायरेक्टरी को बदलना संभव है?


2
सिर्फ एक एन्हांसमेंट सुझाव: यदि आप उपयोग करते हैं pushd(संभवतः >/dev/nullइसके उत्पादन को दबाने के लिए पुनर्निर्देशित किया जाता है) cd, तो आप बाद में पिछली निर्देशिका में वापस आ सकते हैं popd
mklement0

जवाबों:


173

आपको अपनी स्क्रिप्ट को शेल फ़ंक्शन में बदलने की आवश्यकता है:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

कारण यह है कि प्रत्येक प्रक्रिया की अपनी वर्तमान निर्देशिका होती है, और जब आप शेल से किसी प्रोग्राम को निष्पादित करते हैं तो यह एक नई प्रक्रिया में चलाया जाता है। मानक "सीडी", "पुशड" और "पोप" शेल इंटरप्रेटर के लिए निर्मित होते हैं ताकि वे शेल प्रक्रिया को प्रभावित करें।

अपने प्रोग्राम को शेल फंक्शन बनाकर, आप अपने स्वयं के इन-प्रोसेस कमांड को जोड़ रहे हैं और फिर शेल प्रक्रिया में कोई भी निर्देशिका परिवर्तन परिलक्षित होता है।


2
आप tcsh में यह कैसे करेंगे?
joedborg

4
+1। एक चीज जो मैंने नोटिस की थी वह फ़ाइल में थी, हमें कॉल करने से पहले फ़ंक्शन को परिभाषित करना होगा। यह मेरे जैसे अनुभवहीन के रूप में किसी की मदद कर सकता है।
भूषण

एक फ़ंक्शन को परिभाषित करने और एक उपनाम बनाने के बीच बड़ा अंतर क्या है?
हैलोगूडीबाई

1
एक बार जब मैंने इस myprog.sh फ़ाइल को बनाया और इसे .bashrc में जोड़ा तो मैं स्क्रिप्ट कैसे चलाऊँ? क्या मुझे अपने कार्य को दूसरी शेल फ़ाइल से या सीधे शेल से कॉल करना चाहिए? ऐसा लगता है कि यह न तो तरीकों से काम करता है ...
एंड्रिया सिल्वेस्ट्री

1
@AndreaSilvestri या तो लॉग आउट करें या वापस स्रोत या .bashrc में लॉग इन करें। इसे .bashrc में जोड़ना तब तक कुछ नहीं करता जब तक .bashrc नहीं चलता।
जॉन स्ट्रायर

214

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

इसके बजाय, आप अपनी स्क्रिप्ट इस तरह शुरू कर सकते हैं:

. myscript.sh

.तो यह बदला जा सकता है, वर्तमान वातावरण में स्क्रिप्ट का मूल्यांकन करेंगे


4
+1 क्योंकि आप सही हैं। हालांकि मुझे पूरी तरह से संदेह है कि वह एक निर्देशिका को हर बार स्क्रिप्ट को बदलना चाहता है जो उसे चाहिए। इसके अलावा, .shएक्सटेंशन पूरी तरह से eww हैं। उनका उपयोग न करें।
लूनाथ

1
हां, आमतौर पर इसका उपयोग उस तरह से नहीं करना बेहतर होता है। अधिकांश समय आपको खुशी होती है कि आपका वर्तमान वातावरण पीड़ित नहीं है। लेकिन फिर मेरे पास मेरे लिए कुछ सेटअप कार्य करने के लिए स्क्रिप्ट हैं जिनमें सही जगह पर बदलना और फिर मैं शामिल हूं। उन्हें भी। Btw। .sh बेशक व्यक्तिगत शैली का मामला है। संभवत: स्क्रिप्ट सिस्टम को स्थापित करते समय मैं इसका उपयोग नहीं करूंगा। लेकिन मेरे ~ / बिन में मैं यह जानने के लिए उनका उपयोग करता हूं कि क्या है :)
नॉर्बर्ट हार्टल

11
@ ललनाथ .sh एक्सटेंशन पूरी तरह से eww क्यों हैं?
कार्ल प्रिटचेट


1
मेरे लिए उस लेख में तर्क फर्जी है। ऐसा लगता है कि परिणाम को ज्ञात किया गया है, लेकिन इसके कारणों को खोजना इतना आसान नहीं था। इसलिए मैं अपनी बात पर खड़ा हूं, यह व्यक्तिगत शैली की बात है, और कुछ नहीं।
नोर्बर्ट हार्टल

55

जवाबों की अपठनीयता और अधिकता के प्रकाश में, मेरा मानना ​​है कि अनुरोधकर्ता को यही करना चाहिए

  1. उस स्क्रिप्ट को जोड़ें PATH
  2. के रूप में स्क्रिप्ट चलाएँ . scriptname

.(डॉट) यकीन है कि स्क्रिप्ट एक बच्चे खोल में नहीं चला है कर देगा।


38

उपरोक्त को एक साथ रखकर, आप एक उपनाम बना सकते हैं

alias your_cmd=". your_cmd"

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


क्या यह रिबूट में लगातार बना रहेगा?
एसडीसोलर

1
@SDs इसे निरंतर बनाने के लिए आपको इसे अपनी ~ / .bashrc फ़ाइल में जोड़ना होगा। मेरे लिए एक आकर्षण की तरह काम करता है।
राफेल जी।


@ ~/.bash_aliasesबैश लॉन्च होने पर हमेशा सीप नहीं किया जाता है।
माटूस पिओत्रोस्की

31

यदि आप बैश का उपयोग कर रहे हैं, तो आप अन्य प्रयास कर सकते हैं:

.bashrc फ़ाइल में यह लाइन जोड़ें:

alias p='cd /home/serdar/my_new_folder/path/'

जब आप कमांड लाइन पर "p" लिखते हैं, तो यह डायरेक्टरी को बदल देगा।


1
उर्फ के लिए +1। शेल फ़ंक्शन दिलचस्प है लेकिन ओपी ने सीडी के साथ एक सरल नौसेना के लिए कहा। मुझे लगता है कि ज्यादातर लोगों को स्रोत कोड शाखाओं को नेविगेट करने के लिए इस तरह की एक स्क्रिप्ट की आवश्यकता होती है और इसके लिए उपनाम पर्याप्त है
ब्रैड ड्रे

19

यदि आप बैश स्क्रिप्ट चलाते हैं तो यह उसके वर्तमान परिवेश या उसके बच्चों पर संचालित होगी, अभिभावक पर कभी नहीं।

यदि लक्ष्य आपके कमांड को चलाना है: goto.sh / home / test तब इंटरेक्टिवली वर्क इन / होम / टेस्ट करें एक तरीका यह है कि आप अपनी स्क्रिप्ट के भीतर एक बैश इंटरएक्टिव सबस्क्रिप्शन चलाएं:

#!/bin/bash
cd $1
exec bash

इस तरह आप इस शेल से बाहर निकलने (बाहर निकलने या Ctrl + C) तक / घर / परीक्षण में रहेंगे।


मुझे लगा कि यह मेरे द्वारा चलाए जा रहे शेल स्क्रिप्ट के लिए समस्या को ठीक कर देगा लेकिन इसके बजाय यह शेल शुरू करता है और भूल जाता है कि मुझे क्या चाहिए था।
vwvan

13

पुशड के साथ वर्तमान निर्देशिका को निर्देशिका स्टैक पर धकेल दिया जाता है और इसे दी गई डायरेक्टरी में बदल दिया जाता है, पॉपड को डायरेक्टरी को स्टैक के ऊपर मिलता है और फिर उसमें बदल जाता है।

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
यह मेरे प्रश्न का उत्तर देता है - इस समाधान को एस 3 इनिट स्क्रिप्ट के साथ सक्रिय रूप से तैनात करता है और यह पूरी तरह से अच्छी तरह से काम करता है। धन्यवाद @seb
19h

5

बस करने के लिए जाओ

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

और अंतिम पंक्ति के आगे यह कोड जोड़ें:

alias yourcommand="cd /the_path_you_wish"

फिर संपादक को छोड़ दिया।

फिर टाइप करें:

source ~/.bashrc or source ~/.bash_profile on MAC.

अब आप उपयोग कर सकते हैं: टर्मिनल में yourcommand



3

मूल रूप से हम cd..हर निर्देशिका से वापस आने के लिए उपयोग करते हैं। मैंने उन निर्देशिकाओं की संख्या को और अधिक आसान बनाने के लिए सोचा जिनके साथ आपको एक बार में वापस आने की आवश्यकता है। आप इसे एक अलग स्क्रिप्ट फ़ाइल का उपयोग करके उपनाम आदेश का उपयोग करके कार्यान्वित कर सकते हैं। उदाहरण के लिए:

code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

source code.shवर्तमान शेल में उपयोग करने के बाद आप उपयोग कर सकते हैं:

$back 2 

वर्तमान निर्देशिका से दो कदम पीछे आने के लिए। यहाँ पर विस्तार से बताया गया है । यह भी समझाया गया है कि कोड को ~ / .bashrc में कैसे रखा जाए ताकि खोले गए प्रत्येक नए शेल में स्वचालित रूप से यह नया उपनाम हो। आप अधिक if conditionsऔर विभिन्न तर्कों को जोड़कर कोड को संशोधित करके विशिष्ट निर्देशिकाओं में जाने के लिए नई कमांड जोड़ सकते हैं । आप यहां से git से कोड भी खींच सकते हैं


अच्छा समाधान है, इसलिए आप अपने बैश प्रोफाइल को कभी गड़बड़ न करें :)
J4cK

0

यह दृष्टिकोण मेरे लिए आसान है।

मान लें कि एक व्यक्तिगत iMac पर जहां आप एक व्यवस्थापक हैं, डिफ़ॉल्ट निर्देशिका के तहत जब एक कमांड विंडो खोली जाती है, / Users / jdoe, यह जाने के लिए निर्देशिका होगी: /Users/jdoe/Desktop/Mongo/bb.3.2.1 / bin।

ये कदम हैं जो काम कर सकते हैं:

  1. vi मोंगोबिन, जिसमें मैंने प्रवेश किया: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/binपहली पंक्ति के रूप में।
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

देखा!


0

मैंने बकरी नामक एक उपयोगिता भी बनाई है जिसका उपयोग आप आसान नेविगेशन के लिए कर सकते हैं।

आप GitHub पर स्रोत कोड देख सकते हैं ।

V2.3.1 के रूप में उपयोग अवलोकन इस तरह दिखता है:

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

0

मुझे अलग-अलग प्रोजेक्ट के लिए एक ही काम करना पड़ता है, बिना किसी नए खोल के फायरिंग करना।

आपके मामले में:

cd /home/artemb

इस रूप में_स्क्रिप्ट सहेजें:

echo cd /home/artemb

फिर इसके साथ अग्नि दें:

\`./the_script\`

फिर आप उसी शेल का उपयोग करके निर्देशिका में पहुंचते हैं।



0

अपना पथ घोषित करें:

PATH='/home/artemb'     
cd ${PATH}

0

बस PWDइसे अपनी स्क्रिप्ट के अंदर लिखें और निर्यात करें, और परिवर्तन जारी रहेगा।

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