लंबे रास्ते के लिए "उपनाम" कैसे बनाएं?


94

मैंने एक पथ के लिए "उपनाम" बनाने की कोशिश की, जिसका उपयोग मैं अक्सर शेल स्क्रिप्टिंग के दौरान करता हूं। मैंने कुछ कोशिश की, लेकिन यह विफल रहा:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

मैं इसे काम करने लायक कैसे बनाऊ ?
हालांकि, cd ~/Files/Scripts/Mainकाम करता है।

जवाबों:


119

चूंकि यह एक पर्यावरण चर है (उपनाम की एक अलग परिभाषा है bash), आपको इसे कुछ इस तरह से मूल्यांकन करने की आवश्यकता है:

cd "${myFold}"

या:

cp "${myFold}/someFile" /somewhere/else

लेकिन मुझे वास्तव में यह आसान लगता है, अगर आप बस उस निर्देशिका में स्विच करने में आसानी चाहते हैं, तो एक वास्तविक उपनाम ( bashजैसे स्टार्टअप फ़ाइलों में से एक .bashrc) बनाने के लिए, इसलिए मैं कीस्ट्रोक्स बचा सकता हूं:

alias myfold='cd ~/Files/Scripts/Main'

तब आप बस (बिना cd) का उपयोग कर सकते हैं :

myfold

परिभाषा से छुटकारा पाने के लिए, आप उपयोग करते हैं unalias। निम्नलिखित प्रतिलेख कार्रवाई में इन सभी को दर्शाता है:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

धन्यवाद। यह काम करता है। मैंने केवल उर्फ ​​मायफोल्ड = '~ / कुछ / पथ' और सीडी मायफोल्ड की कोशिश की। मुझे एक त्रुटि मिली - ऐसी कोई निर्देशिका नहीं। क्यों ? इसके अलावा, क्या अन्य उपनामों को "अन-असाइन" करना संभव है?
बैशबॉय

myfold = '~ / कुछ / पथ' cd "$ myfold" विफल। क्यों ?
बैशबॉय

1
@bashboy, शायद इसलिए कि आपके पास उस नाम की कोई निर्देशिका नहीं है। ~ / कुछ / पथ एक उदाहरण था, आपको उस वास्तविक पथ को प्रतिस्थापित करना चाहिए जिसका आप उपयोग करना चाहते हैं। मैं इसे आपके उदाहरण निर्देशिका का उपयोग करने के लिए बदल दूँगा ताकि यह स्पष्ट हो। कैसे एक उपनाम को अनसाइन करने के लिए, आप यूनीलैस कमांड का उपयोग करते हैं। मैंने ट्रांसक्रिप्ट के साथ उत्तर को भी अपडेट किया है, जिसमें उस कमांड का उपयोग भी शामिल है।
पैक्सडीब्लो

आप इस उपनाम को विभिन्न टर्मिनल सत्रों में कैसे संरक्षित करेंगे? जब मैं एक नया टैब खोलता हूं और इस उपनाम का उपयोग करने का प्रयास करता हूं, तो यह काम नहीं करता है।
23

4
@goldisfine, मेरे पैतृक देखें in one of the bash startup files like .bashrc। उपनाम को एक उपयुक्त स्टार्टअप फ़ाइल में रखना यह सुनिश्चित करेगा कि यह सभी सत्रों के लिए उपलब्ध हो ।
paxdiablo

74

एक शेल विकल्प है cdable_vars:

cdable_vars
यदि इसे सेट किया जाता है, तो cdअंतर्निहित कमांड के लिए एक तर्क जो कि निर्देशिका नहीं है, को एक चर का नाम माना जाता है जिसका मान बदलने के लिए निर्देशिका है।

आप इसे अपने लिए जोड़ सकते हैं .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

ध्यान दें कि मैंने टिल्ड को बदल दिया है $HOME; उद्धरण टिल्ड के विस्तार को रोकते हैं और बैश शिकायत करते हैं कि कोई निर्देशिका नहीं है ~/Files/Scripts/Main

अब आप इसका उपयोग इस प्रकार कर सकते हैं:

cd myFold

कोई $आवश्यकता नहीं है। वह पूरा बिंदु है, वास्तव में - जैसा कि अन्य उत्तरों में दिखाया गया है, cd "$myFold"शेल विकल्प के बिना काम करता है। cd myFoldयह भी काम करता है यदि पथ में myFoldरिक्त स्थान है, तो आवश्यक कोई उद्धरण नहीं है।

यह आम तौर पर टैब ऑटोकोम्प्लीमेंट के साथ भी काम करता है क्योंकि यदि सेट किया गया है, तो चेक _cdमें फ़ंक्शन bash_completionहोता cdable_varsहै - लेकिन हर कार्यान्वयन एक ही तरीके से नहीं होता है, इसलिए आपको bash_completionफिर से अपने स्रोत में .bashrc(या /etc/profileशेल विकल्प को सेट करने के लिए संपादन) करना पड़ सकता है ।


अन्य गोले के समान विकल्प हैं, उदाहरण के लिए ज़श ( cdablevars)।


1
क्या ZSH के लिए इसके बराबर है?
रयान स्टूल

1
@ रयानस्टल setopt cdablevarsऐसा लग रहा है कि यह हो सकता है, लेकिन मुझे बिल्कुल भी पता नहीं है।
बेंजामिन डब्ल्यू।

@JohnMee मैं आपके संपादन को वापस रोल करूंगा, क) विकल्प के रूप में zsh (कोई अंडरस्कोर) b में अलग से कहा जाता है प्रश्न बस बैश और सी को टैग किया गया है) मैं बैश मैनुअल से लिंक करता हूं। मैं अन्य गोले का उल्लेख करने के लिए एक पैराग्राफ जोड़ूंगा, हालांकि।
बेंजामिन डब्ल्यू।

1
इतना बढ़िया जवाब! cdable_vars
लुकास पी।

1
@ व्लादिस्लाव नोटिस जो cdबैश-पूरा करने के लिए प्रदान किए गए _cdकार्यों को पूरा करता है, जो फ़ंक्शन ( complete -o nospace -F _cd cd) का उपयोग करता है । -vउसको जोड़ना (चर पर पूरा करना) काम करता है, लेकिन अवांछित दुष्प्रभाव हो सकते हैं - मेरे लिए, यह मेरा पूरा वातावरण दिखाता है जब यह टैब पूरा होता है।
बेंजामिन डब्ल्यू।

10

शायद लिंक का उपयोग करना बेहतर है

सॉफ्ट लिंक

प्रतीकात्मक या नरम लिंक (फ़ाइलें या निर्देशिका, अधिक लचीली और स्व दस्तावेजीकरण)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

कड़ी कड़ी

कड़ी कड़ी (केवल फ़ाइलें, कम लचीली और स्वयं दस्तावेजीकरण नहीं)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

डायरेक्ट्री का लिंक कैसे बनाये

संकेत : यदि आपको अपने घर के लिंक को देखने की आवश्यकता नहीं है, तो आप इसे डॉट के साथ शुरू कर सकते हैं। ; तब यह डिफ़ॉल्ट रूप से छिपा होगा फिर आप इसे एक्सेस कर सकते हैं

cd ~/.myHiddelLongDirLink

9

आप अपने बैश के हैशटेबल में अपनी इच्छानुसार कोई भी पथ जोड़ सकते हैं:

hash -d <CustomName>=<RealPath>

अब आप कर सकेंगे cd ~<CustomName>। इसे स्थायी करने के लिए इसे अपनी bashrc स्क्रिप्ट में जोड़ें ।

ध्यान दें कि यह हैशटेब का अर्थ है कैश के लिए कैश प्रदान करने की आवश्यकता नहीं है ताकि हर बार एक कमांड को निष्पादित करने के लिए सामग्री की खोज की जा सके, इसलिए कैश को अमान्य करने वाली घटनाओं पर इस तालिका को मंजूरी दे दी जाएगी, जैसे कि संशोधित करना $PATH


2
मुझे लगता है कि यह केवल काम करेगा, zshलेकिन अंदर नहींbash
सर्ज

यह सबसे अच्छा जवाब IMHO है, लेकिन यह सच है कि यह काम करता है zsh केवल मेरे Ubuntu सिस्टम पर है।
जॉन स्टीवर्ट

6

सबसे पहले, आपको उद्धरण निकालने की आवश्यकता है:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

उद्धरण शैल को अपनी $HOMEनिर्देशिका होने के विशेष अर्थ में टिल्ड के विस्तार से रोकते हैं ।

फिर आप एक शेल चर $myFolderवातावरण का उपयोग कर सकते हैं :

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

एक उपनाम बनाने के लिए , आपको उपनाम को परिभाषित करने की आवश्यकता है:

alias myfolder="cd $myFolder"

फिर आप इस तरह के आदेश की तरह व्यवहार कर सकते हैं:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

यह वास्तव में एक पर्यावरण चर नहीं है जब तक कि आप exportइसे नहीं।
कीथ थॉम्पसन

1
@KeithThompson ठीक है, यह सिर्फ एक शेल चर है । लेकिन, आप इसे निर्यात नहीं करना चाहते हैं क्योंकि आप नहीं चाहते हैं कि यह संभवतः बाल प्रक्रियाओं को प्रभावित करे। आप इसे इस तरह से परिभाषित करते हैं यह आपके .bashrcया जो भी संसाधन फ़ाइल आप उपयोग करते हैं, और इसे तत्काल शेल में परिभाषित किया जाएगा, लेकिन शेल स्क्रिप्ट में नहीं।
डेविड डब्ल्यू।

मैं इस समाधान को पसंद करता हूं क्योंकि यह ऑटो पूर्णता के साथ काम करता है
Vassilis

5

सबसे पहले, आपको $प्रश्न कार्य में कोड बनाने के लिए "myFold" के मूल्य का उपयोग करने की आवश्यकता है :

cd "$myFold"

इसे सरल बनाने के लिए आप इसमें एक उपनाम बनाएँ ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

.bashrcवर्तमान बैश सत्र में उर्फ ​​उपलब्ध होने के लिए स्रोत को भूलना न भूलें :

source ~/.bashrc

अब आप फ़ोल्डर का उपयोग करके बदल सकते हैं:

cdmain

4

एक अन्य विकल्प एक प्रतीकात्मक लिंक का उपयोग करना होगा। अर्थात:

ln -s ~/Files/Scripts/Main ~/myFold

उसके बाद आप ऑपरेशन कर सकते हैं ~/myFold, जैसे:

cp some_file.txt ~/myFold

जो फ़ाइल में डाल देगा ~/Files/Scripts/Main। आप किसी भी समय प्रतीकात्मक लिंक को हटा सकते हैं rm ~/myFold, जो मूल निर्देशिका को रखेगा।


एक नकारात्मक पक्ष: यदि आप cd myFoldतब pwd, यह दिखा देंगे कि आप myFold में हैं। यह मेरे लिए एक सौदा ब्रेकर है क्योंकि पी 4 स्रोत नियंत्रण के साथ संबंधित कमांड वर्तमान निर्देशिका पर निर्भर करते हैं।
User5910

1
@ User5910 - उपयोगpwd -P
डीवीज

2

लेकिन डायर के लिए एक वास्तविक उपनाम भी संभव है, कोशिश करें

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

इस तरह आपके पास एक सामान्य नामकरण सम्मेलन (प्रत्येक dir / उर्फ ​​जोड़ी के लिए) है, और यदि आपको वर्तमान dir से myScripts तक कुछ कॉपी करने की आवश्यकता है, तो आपको इसके बारे में सोचने की ज़रूरत नहीं है।

IHTH


1

पूर्ववर्ती उत्तरों ने कहा कि मैंने कोशिश की कि अलियास निर्देशिका की उपनिर्देशिकाओं के स्वत: विस्तार (स्वतः पूर्णता) की अनुमति न दें।

हालाँकि, यदि आप उस निर्देशिका को धक्का देते हैं जिसे आप dirsस्टैक पर उपनाम देना चाहते हैं ...

$ pushd ~/my/aliased/dir

... तब आप dirs -vस्टैक में इसकी संख्यात्मक स्थिति देख सकते हैं:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

और उस संख्या का उपयोग करते हुए इसका संदर्भ लें, यदि निर्देशिका पैरामीटर की अपेक्षा करने वाले सभी आदेश नहीं हैं:

 $ mv foo.txt ~0  

तुम भी Tab"उपनाम" निर्देशिका के तत्काल उपनिर्देशिका दिखाने के लिए उपयोग कर सकते हैं :

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

निम्न पंक्ति को अपनी myscript में रखें

set myFold = '~/Files/Scripts/Main'

टर्मिनल उपयोग में

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