शेल स्क्रिप्ट में "सीडी" काम क्यों नहीं करता है?


766

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

#!/bin/bash
cd /home/tree/projects/java

मैंने इस फाइल को proj के रूप में सहेजा है, के साथ निष्पादन की अनुमति जोड़ी है chmod, और इसे कॉपी किया है /usr/bin। जब मैं इसे कॉल करता हूं: projयह कुछ नहीं करता है। मैं क्या गलत कर रहा हूं?


10
क्रॉस साइट डुप्लिकेट: superuser.com/questions/176783/…
lesmana

भविष्य में आप हमेशा इसे pwdअंतिम पंक्ति में रखकर परख सकते हैं । इसलिए स्क्रिप्ट खत्म होने से पहले आप जांच सकते हैं कि यह काम कर रहा है या नहीं ..
sobi3ch

5
@lesmana यह कैसे एक डुप्लिकेट है?
अलंड

@ ओलांद क्योंकि ओपी वास्तव में स्क्रिप्ट नहीं चलाता है, इसीलिए उसके लिए काम करने वाला डायर नहीं बदलता है। cdस्क्रिप्ट के अंदर कमांड अच्छी तरह से काम करती है, अपने लिए प्रयास करें।
अलेक्जेंडर गोंचिए

जवाबों:


634

शेल स्क्रिप्ट्स एक सबशेल के अंदर चलाई जाती हैं, और प्रत्येक सब्सक्रिप्शन की अपनी अवधारणा होती है कि वर्तमान निर्देशिका क्या है। cdसफल होता है, लेकिन जैसे ही subshell बाहर निकलता है, तब तक आप इंटरैक्टिव खोल में हो वापस और कुछ भी नहीं कभी वहाँ बदल दिया है।

इसके बदले एक तरीका यह है कि इसके बजाय एक अन्य नाम का उपयोग करें:

alias proj="cd /home/tree/projects/java"

7
उपनाम प्रबंधन या बदलने के लिए इतने लचीले नहीं हैं। कई सीडी के मामले में, स्क्रिप्ट बेहतर हो सकती है।
Thevs

16
उपनाम की तुलना में कार्य अधिक लचीले होते हैं, इसीलिए जब आप पर्याप्त नहीं होते हैं, तो आप अगला स्थान देखेंगे।
ephemient

4
क्या यह ध्यान देने योग्य है कि एमएस-डॉस पर, लिपियों का व्यवहार यह था कि एक कॉलिंग स्क्रिप्ट कमांड शेल की निर्देशिका (और यहां तक ​​कि ड्राइव) को बदल सकती है? और यह कि यूनिक्स में यह दोष नहीं है?
जोनाथन लेफ्लर 23

23
जोनाथन: जबकि यह सच है, यह वास्तव में सवाल से संबंधित नहीं है। जब तक उन्हें प्रत्येक सूची में MS-DOS की संगत कमियाँ होतीं, SO पर उत्तर दो बार मिल जाते!
ग्रेग हेविगेल

17
इसके चारों ओर पाने का एक और तरीका स्क्रिप्ट फ़ाइल को स्रोत करना है: . my-scriptया source my-script
हैलोगूडीबाई

503

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

आप अपनी मौजूदा प्रक्रिया में स्क्रिप्ट को "डॉट" कमांड से चला सकते हैं:

. proj

लेकिन मैं ग्रेग के सुझाव को इस सरल मामले में एक उपनाम का उपयोग करना पसंद करूंगा।


95
.यह भी वर्तनी है source, जो भी आपको अधिक यादगार लगे उसे चुनें।
ephemient

47
@ कुशल: अच्छा पॉइंट सोर्स जो बताता है कि यह क्यों काम करता है सोर्स यह भी साबित करता है कि आलस्य-आवश्यकता नहीं-अक्सर आविष्कार की जननी है
एडम लीस

8
@ रसायन: ध्यान दें कि सी शेल और बाश में स्रोत का उपयोग किया जाता है; यह POSIX या Korn गोले में समर्थित नहीं है, और न ही क्लासिक बॉर्न शेल में।
जोनाथन लेफ़लर

2
"स्रोत" का उपयोग जेड-शेल में किया जाता है
नाथन मूस

1
@AdamLiss यह बहुत अच्छा काम करता है, लेकिन इसमें एक खामी है - किसी भी तरह से स्रोत / डॉट कमांड TAB कुंजी के साथ स्क्रिप्ट / कमांड के ऑटो-पूरा नाम की संभावना को निष्क्रिय कर देता है। TAB कुंजी के साथ तर्क / इनपुट जोड़ना अभी भी संभव है, लेकिन दुर्भाग्य से कमांड के नाम को सीधे इनपुट करने की आवश्यकता है। क्या आप जानते हैं कि इस मामले में TAB प्रमुख काम कैसे करें?
रफाल

215

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

इस समस्या को हल करने का एक पॉज़िक्स-संगत तरीका शेल-इनवाल्ड कमांड स्क्रिप्ट के बजाय शेल प्रक्रिया को परिभाषित करना है ।

jhome () {
  cd /home/tree/projects/java
}

आप बस इसे टाइप कर सकते हैं या इसे विभिन्न शेल स्टार्टअप फ़ाइलों में से एक में डाल सकते हैं।


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

4
यह एक समाधान की तरह लग रहा है! और मैं इसे लागू करने की कोशिश कर रहा हूं, लेकिन यह प्रदर्शन नहीं कर रहा है :( यहाँ मेरी स्क्रिप्ट है: #! / Bin / bash jhome () {echo "कृपया" cd / home echo "काम"} jhome
Gant Laborde

1
@GantMan, आपको इसे "शेल स्टार्टअप फाइल्स" में जोड़ना चाहिए, जैसे ~ / .bashrc
जैकी ये

3
आप एक तर्क (या दो ...) का उपयोग भी कर सकते हैं, जैसे:jhome(){ cd /home/tree/projects/$1; }
irbanana

1
यह सही तरीका होना चाहिए, इससे उदाहरण के लिए "-" जैसे विशेष वर्णों का उपयोग करना संभव हो जाता है।
बैंगकोग्गी

159

cdस्क्रिप्ट के खोल के भीतर किया जाता है। जब स्क्रिप्ट समाप्त हो जाती है, तो वह शेल बाहर निकल जाता है, और फिर आपको उस निर्देशिका में छोड़ दिया जाता है जो आप थे। "स्रोत" स्क्रिप्ट, इसे न चलाएं। के बजाय:

./myscript.sh

करना

. ./myscript.sh

(स्क्रिप्ट नाम से पहले डॉट और स्पेस पर ध्यान दें।)


2
यह अच्छा है, और शायद यह जानना अच्छा है। उत्तरार्द्ध वास्तव में क्या करता है (यह कैसे काम करता है)? यह शायद इस धागे पर सबसे अच्छा समाधान है।
योना

2
fwiw, एडम लिस के उत्तर के टिप्पणी अनुभाग में, 'क्या?' है। यह वही बात हैsource
18:19 बजे g19fanatic

1
सावधान रहें, "स्रोत" एक बशीवाद है। यानी डैश (डेबियन डिफॉल्ट फॉर / बिन / श) इसका समर्थन नहीं करता है, जबकि "।" उम्मीद के मुताबिक काम करता है।
allo

बहुत बढ़िया जवाब! अगर myscript.sh$ PATH में शामिल निर्देशिका में भी है, तो आप इसे पूर्ण पथ निर्दिष्ट किए बिना कहीं से भी स्रोत कर सकते हैं।
कोड

इसने मेरे लिए सबसे अच्छा काम किया। यह समाधान सबसे सरल (+1) है।
हसरबी

96

एक bash स्क्रिप्ट बनाने के लिए जो किसी चुनिंदा डायरेक्टरी को cd करेगी:

स्क्रिप्ट फ़ाइल बनाएँ

#! / Bin / श
# फ़ाइल: / स्क्रिप्ट / सीडीजवा
#
cd / home / askgelal / प्रोजेक्ट्स / जावा

फिर अपनी स्टार्टअप फ़ाइल में एक उपनाम बनाएं।

#! / Bin / श
# फ़ाइल / स्क्रिप्ट / मास्टर कोड
#
उर्फ cdjava = '। / Scripts / cdjava '

  • मैंने एक स्टार्टअप फाइल बनाई, जहां मैं अपने सभी उपनामों और कस्टम फ़ंक्शन को डंप करता हूं।
  • फिर मैंने इस फ़ाइल को अपने .bashrc में प्रत्येक बूट पर सेट करने के लिए स्रोत किया।

उदाहरण के लिए, एक मास्टर उपनाम / फ़ंक्शन फ़ाइल बनाएँ: /scripts/mastercode.sh
(इस फ़ाइल में अन्य नाम रखें।)

फिर अपनी .bashrc फ़ाइल के अंत में :

source /scripts/mastercode.sh



अब अपने जावा निर्देशिका में सीडी के लिए आसान है, बस सीडीवावा टाइप करें और आप वहां हैं।


2
फ़ाइल mastercode.shको शबंग ( #!/bin/sh) की आवश्यकता नहीं है , क्योंकि यह उपधारा में निष्पादित नहीं है (और नहीं हो सकता है)। लेकिन एक ही समय में, आपको इस फ़ाइल के शेल "स्वाद" को दस्तावेज करने की आवश्यकता है; उदाहरण के लिए, ksh या bash (या (t) csh / zsh, आदि), और यह लगभग निश्चित रूप से वास्तव में नहीं है sh। मैं आमतौर पर इस पर संवाद करने के लिए एक टिप्पणी (लेकिन शेबंग नहीं) जोड़ता हूं; उदाहरण के लिए, "इस फाइल का मतलब खट्टा होना (बैश से) है, शेल स्क्रिप्ट के रूप में नहीं चलना चाहिए।"
माइकल

एक और टिप (बाश के लिए): यदि आप अपनी स्क्रिप्ट में वेरिएबल्स का उपयोग करते हैं, तो जैसा कि स्क्रिप्ट sourceडी (के माध्यम से alias) किया जा रहा है , वे चर आपके शेल वातावरण में लीक हो जाएंगे। उससे बचने के लिए, स्क्रिप्ट के सभी काम एक फंक्शन में करें, और इसे स्क्रिप्ट के अंत में कहें। फ़ंक्शन के भीतर, किसी भी चर को घोषित करें local
Rhubbarb

उबंटु में बस ~ / .bash_aliases बनाएं (यदि यह पहले से मौजूद नहीं है)। फिर बस अपने उपनामों को वहां जोड़ें, टर्मिनल और आपके किए गए को पुनरारंभ करें।
व्लाद

51

आप .वर्तमान शेल वातावरण में स्क्रिप्ट निष्पादित करने के लिए उपयोग कर सकते हैं :

. script_name

या वैकल्पिक रूप से, इसके अधिक पठनीय लेकिन शेल विशिष्ट उपनाम source:

source script_name

यह उपधारा से बचा जाता है, और किसी भी चर या निर्मित (सहित cd) को वर्तमान शेल को प्रभावित करने की अनुमति देता है ।


38

जेरेमी रुटेन के एक सिमलिंक का उपयोग करने के विचार ने एक ऐसा विचार पैदा किया जो किसी भी अन्य उत्तर को पार नहीं करता है। उपयोग:

CDPATH=:$HOME/projects

अग्रणी बृहदान्त्र महत्वपूर्ण है; इसका अर्थ है कि यदि वर्तमान निर्देशिका में कोई निर्देशिका 'dir' है, तो cd dirकहीं और बंद करने के बजाय, ' ' वह बदल जाएगा। दिखाए गए मान के साथ, आप यह कर सकते हैं:

cd java

और, अगर वर्तमान निर्देशिका में जावा नाम की कोई उप-निर्देशिका नहीं है, तो यह आपको सीधे $ घर / परियोजनाओं / जावा में ले जाएगी - कोई उपनाम नहीं, कोई स्क्रिप्ट नहीं, कोई संदिग्ध निष्पादन या डॉट कमांड नहीं।

मेरा $ घर / उपयोगकर्ता / जफलर है; मेरा $ CDPATH है:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

30

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

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

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

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

#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash

16
यह एक नया सबस्क्रिप्शन बनाता है। जब आप टाइप exitकरते हैं तो आप उस शेल पर लौट आएंगे जहां आपने यह स्क्रिप्ट चलाई थी।
त्रिपली

1
जब स्क्रिप्ट को कई बार कहा जाता था तो लगता है कि यह नेस्टेड गोले बनाता है और मुझे कई बार 'एग्जिट' टाइप करना पड़ता है। यह किसी भी तरह हल किया जा सकता है?
व्लाडसविट्स्की

अन्य उत्तर देखें: एक उपनाम का उपयोग करें, "पुशड / पोप /
डायर

25

मुझे काम करके अपना कोड मिला. <your file name>

./<your file name> खुराक काम नहीं करती है क्योंकि यह टर्मिनल में आपकी निर्देशिका को नहीं बदलता है यह सिर्फ उस स्क्रिप्ट के लिए विशिष्ट निर्देशिका को बदलता है।

यहाँ मेरा कार्यक्रम है

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

यहाँ मेरा टर्मिनल है

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

2
क्या अंतर है . somethingऔर ./something?? इस जवाब ने मेरे लिए काम किया और मुझे समझ नहीं आया कि क्यों।
द्राकोरत

. somethingआपको स्क्रिप्ट को किसी भी स्थान से चलाने की अनुमति देता है, ./somethingआपको उस निर्देशिका में होना चाहिए जो फ़ाइल में संग्रहीत है।
प्रोजोल जूल


क्या आप शबंग रेखा में बिंदी लगा सकते हैं? #!. /bin/bash?
सिगफ्रीड


12

जब आप किसी शेल स्क्रिप्ट को फायर करते हैं, तो यह उस शेल का नया उदाहरण चलाता है /bin/bash। इस प्रकार, आपकी स्क्रिप्ट केवल एक शेल को फायर करती है, निर्देशिका को बदल देती है और बाहर निकल जाती है। cdशेल स्क्रिप्ट के भीतर एक और तरीका, (और ऐसी अन्य कमांड) डालें जो प्रभावित न हों और न ही उस शेल तक पहुंचें, जहां से उन्हें लॉन्च किया गया था।


11

मेरे विशेष मामले पर मुझे उसी निर्देशिका के लिए बदलने के लिए कई बार आवश्यकता थी। तो मेरे .bashrc (मैं ubuntu का उपयोग करें) पर मैंने जोड़ा है

1 -

$ नैनो ~

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$ स्रोत ~ / .bashrc

3 -

$ स्विचप जावा

सीधे तौर पर यह करेगा: सीडी / होम / ट्री / प्रोजेक्ट्स / जावा

उम्मीद है की वो मदद करदे!


1
@M आप अंततः परियोजना के पेड़ पर सीधे जाने के लिए बिना किसी पैरामीटर के "$ स्विचप" कर सकते हैं
वर्कड्रीमर

2
@workdreamer आपके द्वारा ऊपर वर्णित फ़ंक्शन दृष्टिकोण ने उप-फ़ोल्डरों में जाने में थोड़ी परेशानी को हल किया है जो मेरे सिस्टम में एक ही मूल फ़ोल्डर है। धन्यवाद।
WM

10

आप निम्नलिखित कर सकते हैं:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

संपादित करें: यह बाद में किए गए गोले के निर्माण को रोकने के लिए 'बिंदीदार' हो सकता है।

उदाहरण:

. ./previous_script  (with or without the first line)

1
इसके बजाय कुछ रनों के बाद गड़बड़ हो जाती है .. आपको exitशेल से बाहर निकलने के लिए (या ctrl + d) कई बार करना होगा, उदाहरण के लिए .. एक उपनाम बहुत अधिक क्लीनर है (भले ही शेल कमांड एक डायरेक्टरी को आउटपुट करता है, और यह सीडी है उत्पादन के लिए - उपनाम कुछ = "सीडी getnewdirectory.sh")
dbr

'निष्पादन' पर ध्यान दें। यह पुराने शेल का स्थान लेता है।
thevs

2
निष्पादन केवल उप-शेल को प्रतिस्थापित करता है जो cd कमांड को चला रहा था, न कि उस शेल को जो स्क्रिप्ट को चलाता है। यदि आपने स्क्रिप्ट बिंदी लगाई थी, तो आप सही होंगे।
जोनाथन लेफ्लर 4

इसे 'बिंदीदार' बनाओ - कोई समस्या नहीं। मैंने बस समाधान प्रस्तावित किया। यह इस बात पर निर्भर नहीं करता है कि आप इसे कैसे लॉन्च करते हैं।
Thevs

2
हे, मुझे लगता है कि यह केवल 'कमांड' के लिए केवल cd कमांड के साथ एक 'स्क्रिप्ट' के लिए बेहतर है :) मैं अपना जवाब वैसे भी रखूंगा ... यह गलत बेवकूफ सवाल का सही जवाब होगा :)
Thevs

7

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

आप इसके बजाय एक प्रतीकात्मक लिंक का उपयोग करना चाह सकते हैं । यह आपको एक फ़ाइल या निर्देशिका के लिए "शॉर्टकट" बनाने की अनुमति देता है, इसलिए आपको केवल कुछ टाइप करना होगा cd my-project


हर डायरेक्टरी में सिंपलिंक होना एक उपद्रव होगा। सिम्लिंक को $ HOME में डालना और फिर 'cd ~ / my-project' करना संभव होगा। सच कहूँ तो, यह CDPATH का उपयोग करने के लिए सरल है।
जोनाथन लेफ़लर 5

7

आप एडम और ग्रेग के उपनाम और डॉट दृष्टिकोण को जोड़कर कुछ ऐसा बना सकते हैं जो अधिक गतिशील हो सकता है-

alias project=". project"

अब प्रोजेक्ट उर्फ ​​रनिंग चालू शेल में प्रोजेक्ट स्क्रिप्ट को सब्स्क्राइब के विपरीत चलाएगा।


यह वही है जो मुझे अपनी सभी स्क्रिप्ट को बनाए रखने और बस इसे बैश से कॉल करने और वर्तमान सत्र को बनाए रखने के लिए आवश्यक था - यह सही जवाब है।
मैट द निंजा

7

आप एक उपनाम और एक स्क्रिप्ट को जोड़ सकते हैं,

alias proj="cd \`/usr/bin/proj !*\`"

बशर्ते कि स्क्रिप्ट गंतव्य पथ को ईकोस करे। ध्यान दें कि वे स्क्रिप्ट नाम के आसपास के बैकटिक्स हैं। 

उदाहरण के लिए, आपकी स्क्रिप्ट हो सकती है

#!/bin/bash
echo /home/askgelal/projects/java/$1

इस तकनीक के साथ लाभ यह है कि स्क्रिप्ट किसी भी कमांड लाइन पैरामीटर को ले सकती है और संभवतः जटिल तर्क द्वारा गणना की गई विभिन्न गंतव्यों का उत्सर्जन कर सकती है।


3
क्यों? आप बस का उपयोग कर सकते हैं: proj() { cd "/home/user/projects/java/$1"; }=> proj "foo"(या, proj "foo bar"<= आपके पास रिक्त स्थान है) ... या यहां तक ​​कि (उदाहरण के लिए): proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }=> proj a b c=> एक cdमें करता है/home/user/projects/java/a/b/c
माइकल

6

निर्देशिकाओं को जल्दी से नेविगेट करने के लिए, $ CDPATH, cdargs और स्वचालित रूप से उपनाम उत्पन्न करने के तरीके हैं

http://jackndempsey.blogspot.com/2008/07/cdargs.html

http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html


5

आपकी ~ / .bash_profile फ़ाइल में। अगला फ़ंक्शन जोड़ें

move_me() {
    cd ~/path/to/dest
}

टर्मिनल को पुनरारंभ करें और आप टाइप कर सकते हैं

move_me 

और आपको गंतव्य फ़ोल्डर में ले जाया जाएगा।


3

आप ऑपरेटर && का उपयोग कर सकते हैं:

सीडी myDirectory && ls


डाउनवोट: यह यहां वास्तविक प्रश्न का उत्तर देने का प्रयास नहीं करता है। आप प्रॉम्प्ट पर दो कमांड चला सकते हैं ( &&यदि आप चाहते हैं कि दूसरा पहले पर सशर्त हो, या बस ;या उनके बीच नई लाइन के साथ ) लेकिन इसे स्क्रिप्ट में डालने से आपको वापस ले जाएगा "माता-पिता शेल का उपयोग क्यों नहीं करता है नई निर्देशिका जब cdवास्तव में सफल थी? "
त्रिफली

3

जिस स्क्रिप्ट को आप चलाना चाहते हैं, उसका सोर्सिंग करना एक समाधान है, आपको इस बात की जानकारी होनी चाहिए कि यह स्क्रिप्ट तब आपके वर्तमान शेल के वातावरण को सीधे संशोधित कर सकती है। साथ ही तर्कों को पारित करना संभव नहीं है।

एक और तरीका है, अपनी स्क्रिप्ट को बैश में एक फ़ंक्शन के रूप में लागू करना है।

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

इस तकनीक का उपयोग autojump द्वारा किया जाता है: http://github.com/joelthelion/autojump/wiki आपको शेल डायरेक्टरी बुकमार्क सीखने के लिए प्रदान करने के लिए।


3

आप अपने नीचे एक फंक्शन बना सकते हैं .bash_profileऔर यह आसानी से काम करेगा।

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

cdproj

या

cdproj project_name

यहाँ फ़ंक्शन परिभाषा है।

cdproj(){
    dir=/Users/yourname/projects
    if [ "$1" ]; then
      cd "${dir}/${1}"
    else
      cd "${dir}"
    fi
}

अपने स्रोत के लिए मत भूलना .bash_profile


1
उर्फ की तुलना में बहुत बेहतर जवाब
Pax0r

यह समाधान अपनी सादगी और लचीलेपन में शानदार है।
कर्जरतन

3

यह वही करना चाहिए जो आप चाहते हैं। ब्याज की निर्देशिका में बदलें (स्क्रिप्ट के भीतर से), और फिर एक नया बैश शेल स्पॉन करें।

#!/bin/bash

# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash

यदि आप इसे चलाते हैं, तो यह आपको ब्याज की निर्देशिका में ले जाएगा और जब आप इसे छोड़ देंगे तो यह आपको मूल स्थान पर वापस लाएगा।

root@intel-corei7-64:~# ./mov_dir.sh

root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#

जब आप बाहर निकलें ( CTRL+ d)


3
एक नए बैश का मतलब है कि आप अपना इतिहास खो देंगे और यह नए सिरे से शुरू होगा।
Tisch

2

LOOOOOng समय के बाद, लेकिन मैंने निम्नलिखित किया:

केस नामक एक फाइल बनाएं

फ़ाइल में निम्नलिखित पेस्ट करें:

#!/bin/sh

cd /home/"$1"

इसे सहेजें और फिर:

chmod +x case

मैंने अपने में एक उपनाम भी बनाया .bashrc:

alias disk='cd /home/; . case'

अब जब मैं टाइप करता हूं:

case 12345

अनिवार्य रूप से मैं टाइप कर रहा हूं:

cd /home/12345

आप 'केस' के बाद कोई भी फ़ोल्डर टाइप कर सकते हैं:

case 12

case 15

case 17

जो टाइपिंग की तरह है:

cd /home/12

cd /home/15

cd /home/17

क्रमश:

मेरे मामले में रास्ता बहुत लंबा है - इन लोगों ने इसे ~ जानकारी के साथ पहले ही जोड़ दिया।


1
cdउर्फ में ज़रूरत से ज़्यादा और असजीला है; उपनाम बस 'चाहिए। इसके बजाय ~ / केस`। यह caseएक आरक्षित कीवर्ड भी है, इसलिए नाम के लिए खराब विकल्प है।
ट्रिपल

1

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

shopt -s cdable_vars

आपके पर्यावरण चर की सामग्री के लिए ~/.bashrcअनुमति देता है cd

ऐसे पर्यावरण चर बनाएं:

export myjava="/home/tree/projects/java"

और आप उपयोग कर सकते हैं:

cd myjava

अन्य विकल्प


0

यदि आप मछली को अपने खोल के रूप में उपयोग कर रहे हैं , तो सबसे अच्छा समाधान एक फ़ंक्शन बनाना है। एक उदाहरण के रूप में, मूल प्रश्न को देखते हुए, आप नीचे दी गई 4 पंक्तियों को कॉपी कर सकते हैं और उन्हें अपने फ़िश कमांड लाइन में पेस्ट कर सकते हैं:

function proj
   cd /home/tree/projects/java
end
funcsave proj

यह फ़ंक्शन बनाएगा और इसे बाद में उपयोग के लिए बचाएगा। यदि आपका प्रोजेक्ट बदलता है, तो नए पथ का उपयोग करके प्रक्रिया को दोहराएं।

यदि आप चाहें, तो आप निम्न कार्य करके मैन्युअल रूप से फ़ंक्शन फ़ाइल जोड़ सकते हैं:

nano ~/.config/fish/functions/proj.fish

और पाठ दर्ज करें:

function proj
   cd /home/tree/projects/java
end

और अंत में बाहर निकलने के लिए ctrl + x दबाएं और अपने परिवर्तनों को सहेजने के लिए वापसी करें।

( नोट: फंकसेव का उपयोग करने का पहला तरीका आपके लिए proj.fish फ़ाइल बनाता है )।


0

मेरे पास
gashub.com/godzilla/bash-stuff पर निर्देशिका बदलने का प्रबंधन करने के लिए एक साधारण बैश स्क्रिप्ट है जिसे
स्क्रिप्ट को आपकी स्थानीय बिन निर्देशिका (/ usr / स्थानीय / बिन) में
डाल दिया गया है और डाल दिया गया है

alias p='. p'

अपने .bashrc में


यह क्या करता है? ); ऐसा लगता है कि यह रिकर्सिवली ही चल पाएंगे, यदि आप इसे चलाते हैं इससे पहले कि यह नहीं है, हालांकि मुझे यकीन है कि
रयान टेलर

0

चर्चा पर ध्यान दें कि मैं मूल प्रक्रिया की कार्यशील निर्देशिका कैसे निर्धारित करूं?

इसमें कुछ हैकिश उत्तर हैं, जैसे https://stackoverflow.com/a/2375174/755804 (gbb के माध्यम से मूल प्रक्रिया निर्देशिका को बदलना, ऐसा न करें) और https://stackoverflow.com/a/51985735/755804 ( पैरेंट प्रोसेस के इनपुट स्ट्रीम में cd dirnametailcd इंजेक्ट करने वाली कमांड ; अच्छा, आदर्श रूप से इसे हैक के बजाय बैश का हिस्सा होना चाहिए)


0

यह एक पुराना सवाल है, लेकिन मैं वास्तव में हैरान हूं कि मुझे यह ट्रिक यहां दिखाई नहीं दे रही है

सीडी का उपयोग करने के बजाय आप उपयोग कर सकते हैं

export PWD=the/path/you/want

उप-आधार बनाने या उपनाम का उपयोग करने की आवश्यकता नहीं है।

ध्यान दें कि यह सुनिश्चित करना आपकी ज़िम्मेदारी है कि आप / पथ / आप / मौजूद हैं।


दुर्भाग्य से, काम नहीं किया।
ttfreeman

0

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

एक समाधान यह है कि bash script ( ) के बजाय bash फ़ंक्शन का उपयोग किया जाए sh; किसी फ़ंक्शन में अपना बैश स्क्रिप्ट कोड रखकर। यह फ़ंक्शन को कमांड के रूप में उपलब्ध कराता है और फिर, इसे बिना किसी चाइल्ड प्रोसेस के निष्पादित किया जाएगा और इस प्रकार कोई भी cdकमांड कॉलर शेल को प्रभावित करेगा।

बैश कार्य:

बैश प्रोफ़ाइल की एक विशेषता कस्टम फ़ंक्शंस को संग्रहीत करना है जिसे टर्मिनल में या बैश स्क्रिप्ट में उसी तरह से चलाया जा सकता है जिस तरह से आप एप्लिकेशन / कमांड चलाते हैं, इसे लंबे कमांड के लिए शॉर्टकट के रूप में भी इस्तेमाल किया जा सकता है।

अपने फ़ंक्शन को प्रभावी ढंग से सिस्टम बनाने के लिए आपको कई फ़ाइलों के अंत में अपने फ़ंक्शन को कॉपी करना होगा

/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile

आप sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profileउन फ़ाइलों को जल्दी से संपादित / बना सकते हैं

कैसे :

अपने बैश प्रोफाइल फाइल के अंत में एक नए फंक्शन के अंदर अपने बैश स्क्रिप्ट कोड को कॉपी करें और अपने टर्मिनल को रीस्टार्ट करें, फिर आप cddजो भी फंक्शन लिख सकते हैं उसे चला सकते हैं ।

स्क्रिप्ट उदाहरण

के cd ..साथ शॉर्टकट बनानाcdd

cdd() {
  cd ..
}

एलएस शॉर्टकट

ll() {
  ls -l -h
}

एलएस शॉर्टकट

lll() {
  ls -l -h -a
}

-2

यदि आप बैकस्लैश के साथ लाइनों को समाप्त करते हैं, तो आप उसी उपधारा में कुछ पंक्तियों को निष्पादित कर सकते हैं।

cd somedir; \
pwd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.