बस कुछ इसी तरह से टकराया; आशा है कि यह मेरे नोट्स पोस्ट करने के लिए ओ.के. एक बात जो मुझे gitतर्क के साथ उपनामों के बारे में भ्रमित करती है, शायद git help configउससे आती है (मेरे पास git संस्करण 1.7.9.5 है):
यदि उर्फ विस्तार को विस्मयादिबोधक बिंदु के साथ उपसर्ग किया जाता है, तो इसे शेल कमांड के रूप में माना जाएगा। उदाहरण के लिए, "alias.new =! Gitk --all --not ORIG_HEAD" को परिभाषित करना, मंगलाचरण "git new" शेल कमांड "gitk --all-not ORIG_HEAD" को चलाने के बराबर है। ध्यान दें कि शेल कमांड्स को रिपॉजिटरी के शीर्ष-स्तरीय डायरेक्टरी से निष्पादित किया जाएगा, जो वर्तमान में जरूरी नहीं हो सकता है। [...]
जिस तरह से मैं इसे देखता हूं - यदि एक उपनाम "शेल कमांड के रूप में माना जाएगा" जब विस्मयादिबोधक बिंदु के साथ उपसर्ग किया जाता है - मुझे फ़ंक्शन का उपयोग करने की आवश्यकता क्यों होगी, या sh -cतर्कों के साथ; क्यों नहीं मेरी आज्ञा के रूप में लिख रहा है?
मुझे अभी भी जवाब नहीं पता है - लेकिन मुझे लगता है कि वास्तव में परिणाम में थोड़ा अंतर है। यहाँ एक छोटी सी परीक्षा है - इसे अपने .git/configया अपने में फेंक दो ~/.gitconfig:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
यहाँ मैं क्या इन उपनाम चल रहा है:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... या: जब आप !किसी gitअन्य में "जैसा है" के बाद "सादे" कमांड का उपयोग कर रहे हैं - तो gitस्वचालित रूप से उस कमांड में तर्क सूची को जोड़ देता है! इससे बचने का एक तरीका, वास्तव में, आपकी स्क्रिप्ट को एक फ़ंक्शन के रूप में - या तर्क के रूप में कॉल करना है sh -c।
यहां (मेरे लिए) एक और दिलचस्प बात यह है कि एक शेल स्क्रिप्ट में, एक व्यक्ति आमतौर पर स्क्रिप्ट $0के फ़ाइल नाम के लिए स्वचालित चर की अपेक्षा करता है । लेकिन एक gitउपनाम फ़ंक्शन के लिए, $0तर्क मूल रूप से, पूरे स्ट्रिंग की सामग्री उस कमांड को निर्दिष्ट करता है (जैसा कि कॉन्फ़िगरेशन फ़ाइल में दर्ज किया गया है)।
यही कारण है कि, मुझे लगता है, अगर आप गलत तरीके से होते हैं - नीचे के मामले में, जो बाहरी दोहरे उद्धरणों से बच जाएगा:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - तब git(मेरे लिए, कम से कम) कुछ गुप्त संदेश के साथ विफल होगा:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
मुझे लगता है, चूँकि git"एक पूरे स्ट्रिंग को" केवल एक तर्क के रूप में देखा !- इसने इसे एक निष्पादन योग्य फ़ाइल के रूप में चलाने की कोशिश की; और तदनुसार यह "echo 'A' 'B'"एक फ़ाइल के रूप में खोजने में विफल रहा ।
किसी भी स्थिति में, git help configउपरोक्त उद्धरण के संदर्भ में , मैं अनुमान लगाऊंगा कि यह कुछ और बताने के लिए सटीक है: " ... मंगलाचरण" git new "शेल कमांड चलाने के बराबर है" gitk --all --not ORIG_HEAD $ @ ", जहां $ @ रनटाइम पर कमांड लाइन से git कमांड उपनाम के लिए दिए गए तर्क हैं ... "। मुझे लगता है कि यह भी समझाएगा, क्यों ओपी में "प्रत्यक्ष" दृष्टिकोण स्थितीय मापदंडों के साथ काम नहीं करता है।
$1काम करना चाहिए)।