मैं एक git [एक्शन] कमांड के लिए एक उपनाम कैसे बना सकता हूं (जिसमें रिक्त स्थान शामिल हैं)?


29

मेरे अधिकांश उपनाम इस रूप में हैं: alias p='pwd'

मैं उर्फ ​​करना चाहता हूं git commitताकि यह होgit commit -v

लेकिन अंतरिक्ष के साथ एक उपनाम बनाने की कोशिश करना एक त्रुटि देता है:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

जवाबों:


31

आपके प्रश्न का सीधा उत्तर नहीं है (चूंकि उपनाम केवल एक शब्द हो सकता है), लेकिन आपको git-configइसके बजाय उपयोग करना चाहिए :

git config --global alias.civ commit -v

यह एक git उर्फ ​​बनाता है ताकि git civचलाता है git commit -v। दुर्भाग्य से, AFAIK उपनामों के साथ मौजूदा गिट कमांड को ओवरराइड करने का कोई तरीका नहीं है । हालांकि, आप हमेशा विकल्प के रूप में रहने के लिए एक उपयुक्त उपनाम नाम चुन सकते हैं।


नोट के बारे में जवाब देने के लिए जोड़ा देखें git configनहींgit-config
माइकल Durrant

के रूप में इस उत्तर धागा आप बनाता स्पष्ट जुड़ा हुआ है कि करने के लिए है, यह है मौजूदा ओवरराइड करने के लिए संभव gitखोल स्क्रिप्ट का सिर्फ एक छोटा सा के साथ, उपनाम के साथ आदेशों। (मैं इस टिप्पणी को एक आलोचना, BTW के रूप में पोस्ट नहीं कर रहा हूं। यह जवाब आपके लगभग एक साल बाद पोस्ट किया गया था! मैं इसे सिर्फ इस उम्मीद में पोस्ट कर रहा हूं कि लोगों को यह मददगार लगे।)
sampablokuper

17

आप एक कमांड के बारे में बात कर रहे हैं जिसमें एक स्पेस शामिल है, लेकिन यहां कमांड है gitऔर वहां कोई स्पेस नहीं है।

Git कमिट कॉल करने के लिए , आपको इसे लिखना होगा

git\ commit ...
'git commit' ...
"git commit" ...

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

csh, tsh या zsh आपको उपरोक्त में से किसी को भी उर्फ ​​करने की अनुमति देगा, लेकिन बैश या ksh नहीं (हालाँकि pdksh आपको अनुमति देगा लेकिन आप आपको उनका उपयोग नहीं करने देंगे)। Zsh में:

alias "'git commit'=git commit -v"
'git commit' ...

कर देगा git commandआदेश (जब के रूप में बुलाया 'git command'के लिए एक उपनाम केवल (एकल उद्धरण के साथ)) gitके साथ आदेश commitऔर -vतर्क। नहीं, जो आप देख रहे थे, हालांकि मुझे लगता है।

क्योंकि aliasकेवल उर्फ कमांड्स ही कर सकते हैं , यहां आप सभी उपनाम कर सकते हैं git, और आपको कुछ ऐसा करने की आवश्यकता है, जो इसके तर्कों की सूची में "प्रतिबद्ध" के बाद "-v" सम्मिलित करता है। सबसे अच्छा तो @ jw013 के समाधान के साथ जाना होगा, लेकिन अगर किसी कारण से आप एक उपनाम का उपयोग करने के बजाय या नहीं कर सकते, तो आप कार्य करने के लिए एक फ़ंक्शन का उपयोग कर सकते हैं:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
ध्यान दें कि रिक्त स्थान या अन्य विशेष पात्रों के साथ उपनामों की अनुमति देना बॉश-शैली के गोले (जो कि एक अजीब तरीके से अनुकरण करता है) में मौजूद नहीं है। बॉर्न-शैली के गोले उर्फ ​​विस्तार को अक्षम करते हैं जब पहले शब्द को किसी भी तरह से उद्धृत किया जाता है, तो रेनान का जवाब देखें
गिल्स एसओ- बुराई को रोकना '

हाँ। इसलिए मैंने कहा कि यह केवल csh, tsh और zsh में काम करता है, जो कि बग नहीं है। ध्यान दें कि बॉर्न शेल उपनामों का समर्थन नहीं करता है। उपनाम csh द्वारा पेश किए गए थे।
स्टीफन चेज़लस

9

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

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

यह कैसे काम करता है: आप उस कमांड से शुरू करते हैं जिसे आप कॉल करना चाहते हैं। मेरे मामले में यह है sudo
फिर, आप इसका उल्लेख करते हैं कि यह क्या पैरामीटर लेगा। इस मामले में, pacman -Syu
यदि, ट्रिगर किया गया है, तो इसे किस कमांड पर अमल करना चाहिए? उपरोक्त कथन में यह है pacup.sh
वरना, क्या आदेश, निष्पादित किया जाना है sudo $@$@जैसा कि आपने अनुमान लगाया होगा, पैरामीटर सूची कमांड को लेता है।

इसलिए, अपने विशेष मामले के लिए कमांड बनाना, यह होगा:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

हालाँकि, यह समाधान अधिक सामान्य स्थिति के लिए है जब आप उनमें व्हाट्सएप के साथ आदेश देना चाहते हैं।
आपके विशिष्ट मामले में, मैं आपको सलाह देंगे कि आप अपने git कमांड का उपयोग करके jw013 के समाधान के साथ जाएंgit-config


क्या आपका मतलब नहीं है if [[ $1 == 'commit' ]]...? $ @ के विस्तार के लिए आपके पास वास्तव में रखने के लिए अधिक तर्क हो सकते हैं।
कोजीरो

सही! मेरा बुरा .. मैंने बस उस कथन को बदल दिया जिसका उपयोग मैं अपने सिस्टम के लिए कर रहा था।
दर्पणी

यह कमाल है - धन्यवाद - यह मेरी ज़रूरत के लिए एकदम सही है;
cgseller

4

से बैश उर्फ आदमी पेज

प्रत्येक साधारण कमांड का पहला शब्द, यदि अयोग्य है, तो यह देखने के लिए जाँच की जाती है कि उसमें एक उपनाम है या नहीं। यदि हां, तो उस शब्द को उपनाम के पाठ से बदल दिया जाता है। उपनाम नाम और प्रतिस्थापन पाठ में शेल मेटाचैकर सहित कोई मान्य शेल इनपुट शामिल हो सकता है, अपवाद के साथ कि उपनाम नाम में '=' ​​नहीं हो सकता है।

प्रतिस्थापन पाठ के पहले शब्द का परीक्षण उपनामों के लिए किया जाता है, लेकिन एक शब्द जो कि उपनाम के समान है, का विस्तार दूसरी बार नहीं किया जाता है। इसका मतलब यह है कि कोई भी उर्फ ​​ls को "ls -F" दे सकता है, उदाहरण के लिए, और बैश रिप्लेसमेंट टेक्स्ट को पुनरावर्ती रूप से विस्तारित करने का प्रयास नहीं करता है।

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

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

इसे अनुकूलित किया जा सकता है git


आपके द्वारा दिया गया लिंक मेरे द्वारा किए गए बैश डॉक्यूमेंटेशन से अलग है और बैश व्यवहार के साथ विरोधाभास में प्रतीत होता है। यह कहता है कि उदाहरण के लिए अन्य नामों में रिक्त स्थान की अनुमति है। यह मेरे लिए zsh व्यवहार की तरह दिखता है, भले ही वह पृष्ठ स्पष्ट रूप से बैश कहे।
स्टीफन चेजेलस

2
@sch Bourne / POSIX गोले अलियास विस्तार यदि किसी शब्द को किसी भी तरह से उद्धृत किया जाता है। उदाहरण के लिए \lsएक उपनाम को बायपास करता है ls
गिल्स एसओ- बुराई को रोकें '

1
@Gilles। बॉर्न शेल उपनामों को लागू नहीं करता है। पोसिक्स का कहना है कि एक वैध अलियास नाम (केवल ASCII अलनम + [_!%,@]) से मेल खाते हुए एक निर्विवाद शब्द का विस्तार किया जाएगा। यह zsh के '\ ls' के एलियासिंग, या ksh / डैश / bash / zsh के aliasing जैसे एक्सटेंशन को मना नहीं करता है a-bअन्यथा किसी भी एक POSIX शेल का अस्तित्व नहीं होगा। यह सिर्फ एक पोर्टेबल स्क्रिप्ट कहती है (शेल नहीं) ऐसे किसी अन्य उपनाम का उपयोग नहीं करना चाहिए।
स्टीफन चेज़लस

2
@sch POSIX उपनामों में अन्य वर्णों का उपयोग करने के लिए कार्यान्वयन की अनुमति देता है, लेकिन शब्द के किसी भी भाग को उद्धृत करने से उपनाम विस्तार में बाधा उत्पन्न होती है । यदि आप 'git commit'POSIX शेल में कमांड पोजीशन में लिखते हैं , तो इसे बिल्ट-इन यूटिलिटी, फंक्शन या एक्सटर्नल कमांड इनवाइट करना होगा।
गिल्स एसओ- बुराई को रोकना '

0

भले ही सही समाधान एलियंस का उपयोग करने के लिए है जैसे कि jw013 ने सुझाव दिया है, रिक्त स्थान के साथ उपनाम बनाने के लिए आप नेस्ट उपनाम कर सकते हैं।

उदाहरण के लिए मेरे पास स्थानीय और दूरस्थ रूप से शाखा को हटाने के लिए एक उपनाम है, लेकिन मैं चाहूंगा कि उपयोगकर्ता हमेशा शाखा निर्दिष्ट करें:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

से इस उदाहरण के लिए, यह काम करना चाहिए:

इसलिए, यदि आप अभी भी अन्य कमांडो के साथ सुडोकू का उपयोग करना चाहते हैं, लेकिन शटडाउन के साथ नहीं और यदि आप किसी अन्य चीज के लिए उर्फ ​​शटडाउन का खर्च उठा सकते हैं, तो आपके पास हो सकता है:

alias sudo='sudo '
alias shutdown="echo nope"

लेकिन आपके आदेशों के साथ:

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