क्या al ,, ’को '..’ किया जा सकता है?


41

कभी-कभी जब मैं मूल निर्देशिका में बदलना चाहता हूं, तो मैं गलती से cd ,,इसके बजाय टाइप करता हूं cd ..। क्या कोई ऐसा तरीका है जिससे मैं इन बयानों को एक जैसा मान सकता हूँ? मैं कभी भी अपने कमांड में कॉमा का उपयोग नहीं करता। आदर्श रूप से, मैं उर्फ ​​के ,,लिए करना चाहूंगा ..। जब मैंने यह कोशिश की, यह काम नहीं किया। यह काम क्यों नहीं किया? मैं इस समस्या से कैसे निपट सकता हूं?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
एक उपनाम कार्यक्रम चलाने का कार्यक्रम है, कार्यक्रम का तर्क नहीं; इसलिए $ ,,शिकायत होगी, जैसे bash: ..: Is a directory:। (दूसरे शब्दों में, यह एक निष्पादन योग्य नहीं है।)
jpaugh

5
@jpaugh: यह कहने का एक स्पष्ट तरीका है: उपनाम का विस्तार केवल एक कमांड के पहले "शब्द" पर होता है। तो जैसा कि आप कहते हैं, यह केवल कमांड नामों के लिए काम करता है, न कि args। (और आप भी नहीं कर सकते alias 'cd ,,'='cd ..'। ठीक है, आप कर सकते हैं, लेकिन आपको cd\ ,,इसे एक ही शब्द के रूप में चलाने के लिए करना होगा।)
पीटर कॉर्डेस

5
Zsh पर विचार करें। यह वैश्विक उपनाम इसलिए है, alias -g ,,=..और cd ,,के रूप में आप यह करने की उम्मीद काम करता है।
मुरु

1
पार्श्व सोच: find / -type d -exec ln -s .. {}/,, \;... ;-)
टोबे स्पाइट

2
Imho: यह मत करो। टाइपोग्राफिक त्रुटियों को कवर करने के लिए उपनाम का उपयोग करना एक बुरा अभ्यास है। वे त्रुटियां कॉपी-पेस्ट किए गए कोड या स्क्रैनास्ट में समाप्त हो सकती हैं। यह अन्य होस्ट या खातों में काम नहीं करेगा। और इस तरह के संशोधन (यह कैसे लागू किया जाता है पर निर्भर करता है) अन्य, अप्रत्याशित, त्रुटियों को डीबग करना मुश्किल हो सकता है। मेरा सुझाव: यदि आप एक आदेश को गलत मानते हैं, तो बस इसे फिर से टाइप करें ;-)।
जेजमोंट्स

जवाबों:


45

ZSH:

यदि आप का उपयोग कर रहे हैं zsh alias -g ,,="..", तो आपको इसकी आवश्यकता है, लेकिन इसका कारण ",," हर जगह विस्तारित किया जाएगा, न कि केवल जब इसका उपयोग किया जाता है cd

से man zshbuiltins:

यदि -g ध्वज मौजूद है, तो एक वैश्विक उपनाम परिभाषित करें; वैश्विक उपनामों का विस्तार किया जाता है, भले ही वे कमान की स्थिति में न हों।

दे घुमा के:

यदि प्रतिबंधित है bash(जैसा कि प्रश्न को साथ टैग किया गया है ), तो निम्न पढ़ें:

यह एक शुद्ध-उर्फ समाधान है, जैसा कि अनुरोध किया गया है, हालांकि यह उपयोगकर्ता को निराश करने की आवश्यकता से अधिक काम करेगा (मेरी पोस्ट के अंत में चेतावनी देखें)।

उद्धरण man bash:

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

इसलिए यह cdएक अतिरिक्त स्थान के साथ उर्फ के लिए पर्याप्त है (इसके अगले तर्क के विस्तार की अनुमति देने के लिए) और फिर उर्फ ​​के ,,लिए ..। देखना है कि

alias cd='cd '
alias ,,='..'

आपको वही चाहिए जो आपको चाहिए।

ध्यान दें कि यह न केवल के लिए सही है bash(और इसके aliasकार्यान्वयन), लेकिन सभी POSIX-compilant गोले। उदाहरण से उद्धृत करते हुए man 1p alias(मैनुअल इस सुविधा का स्पष्ट रूप से वर्णन नहीं करता है, केवल एक उदाहरण के माध्यम से):

  1. Nohup सेट करें ताकि यह एक तर्क से निपट सके जो स्वयं एक उपनाम है:

           alias nohup="nohup "

चेतावनी: जैसा कि @PeterCordes ने अपनी टिप्पणी में लिखा है, यह स्वचालित रूप से अन्य उपनामों का विस्तार करेगा जब बाद में लिखा जाएगा cdcd \grepयदि आप निर्देशिका को एक नाम में बदलना चाहते हैं, तो आपको यह लिखना पड़ सकता है, grepलेकिन आपके grepलिए एक उपनाम है grep --color=auto। बैकस्लैश के बिना, cd"बहुत सारे तर्क" त्रुटि की रिपोर्ट करेंगे (आप cdएक ही बार में दो निर्देशिका नहीं कर सकते )


22
यह एक चतुर लेकिन बुरा हैक है। मैं ऐसा नहीं करना चाहता; इसके लिए बहुत आसान है कि आप गलती से काट लें। जैसे अगर आपके पास आमतौर पर चलने वाली कमांड के लिए एक उपनाम है, और आप cdइसके स्रोत कोड की निर्देशिका में चाहते हैं । या आपके उपनाम और सामान्य निर्देशिका नामों के बीच अन्य टकराव। जैसे इस उपनाम के साथ मेरे लिए cd drविस्तार होगा cd disown -r। वैसे भी, cdइस तरह के सामान के लिए एक फ़ंक्शन के साथ बिलिन को ओवरराइड करना बेहतर है , आईएमओ।
पीटर कॉर्डेस

8
शुद्ध-उर्फ समाधान के लिए +1 (मैंने कुछ सीखा)। उसी समय मैं पीटर की टिप्पणी से सहमत हूं। मुझे लगता है कि आपके जवाब में किसी प्रकार की स्पष्ट चेतावनी जोड़ी जानी चाहिए।
कामिल मैकियोरोव्स्की

58

उपनाम ऐसा करने के लिए नहीं हैं, लेकिन आप एक फ़ंक्शन बना सकते हैं जिसे cdवास्तविक के लिए एक आवरण कहा जाता है cd। यह एक मेरे लिए काम करता है! बस इसे अपनी .bash_profileया अपनी पसंद की प्रोफ़ाइल फ़ाइल में डालें ।

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

या, टिप्पणियों और सुंदर प्रारूपण के साथ:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

संपादित करें

यह इंगित करने के लिए धन्यवाद @derobert if then elseयहाँ से बेहतर है && ||। इसके अलावा, मुझे अभी पता चला है ( * फेसपालम *) कि यह कार्यान्वयन केवल तभी काम करेगा जब कोई गैर-पथ तर्क (यानी -L -P) पहला तर्क न हो। तो चेतावनी दी जाए, अगर आपको टाइप करने की बुरी आदत है तो cd -L ,,यह आपकी मदद करने वाला नहीं है। और यह सही ढंग से संभालने के लिए गैर-तुच्छ है, मुझे लगता है।


16
@BenjiWiebe मुझे लगता है कि "टिप्पणियां और सुंदर स्वरूपण" संस्करण एक अगर-तब-के साथ बेहतर होगा।
zwol

वाह दोस्तों, बहुत सारे अच्छे विचार। मुझे लगता है कि आप आवश्यक सुधारों का ध्यान रखने के लिए संपादन सुविधा का उपयोग कर रहे हैं। मैंने इसका परीक्षण करने में अधिक समय नहीं लगाया। :)
बेन्जीवेबे

1
वैकल्पिक रूप से, $1बिल्ट-इन निष्पादित करने से पहले सिर्फ ओवरराइट करें :cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
टोबी स्पाइट

1
@ TobySpeight set .. "${@:2}", या आप पहले तर्क के बाद कुछ भी खो देते हैं।
चेपनर

8
इसके अलावा, तकनीकी ..रूप से पहला तर्क होना जरूरी नहीं है; cdमें bashविकल्प की एक किस्म ले जा सकते हैं ( -P, -L, -@, -e)।
चेपनर

29

उपनाम एक आदेश का पहला शब्द होना चाहिए । इसके अलावा, उपनाम किसी शब्द के लिए प्रतिस्थापित किया जाना चाहिए इसलिए कोई स्थान नहीं)।

बैश संदर्भ मैनुअल: उपनाम

उपनाम एक स्ट्रिंग को एक शब्द के लिए प्रतिस्थापित करने की अनुमति देता है जब इसे एक साधारण कमांड के पहले शब्द के रूप में उपयोग किया जाता है ।

तुम दोनों ..और ,,हो सकते हैं cd ..

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

मैं बिल्कुल यही करता हूँ! : D ये दो डॉट्स / कॉमा टाइप करने के लिए बहुत आसान हैंcd ..
rav_kr

10
+1, यह एक बुरा विचार नहीं है। .. बाश में इसे करने का एक और तरीका है shopt -s autocdजिसके साथ आप अपना नाम दर्ज करके किसी भी निर्देशिका में बदल सकते हैं। बेशक आप अभी भी उर्फ,,
ilkachachu


3

..निर्देशिका को बदलने का एक और तरीका है बैश की autocd सुविधा को सक्षम करना :

shopt -s autocd 

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

~$ /tmp
cd /tmp
/tmp$ 

आपको अभी भी एक अन्य के लिए एक उपनाम बनाना होगा ,,लेकिन यह सिर्फ साथ किया जा सकता हैalias ,,=..


2

वहां पहले से ही है एक ऐप्लिकेशन : उस के लिए एक स्क्रिप्ट https://github.com/shyiko/commacd (स्टेनली Shuyiko साथ कोई संबद्धता)।

commacdनिर्यात तीन आज्ञाओं: ,(आगे कूदने के लिए), ,,(पिछड़े) और ,,,(पिछड़े + आगे):

वे तीनों पहले उपसर्ग द्वारा मिलान करने का प्रयास करते हैं। केवल यदि कोई परिणाम नहीं मिले हैं, तो क्या वे मिलान (फजी) मिलान करने के लिए वापस आएंगे

आपके प्रश्न का उत्तर देने के लिए स्क्रिप्ट एलियास तीन कार्यों को परिभाषित करता है:

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