जवाबों:
उपनाम इस तरह के आदेश हैं कि उनके लिए सभी तर्क उस कार्यक्रम के तर्क के रूप में पारित किए जाते हैं जो वे उर्फ करते हैं। उदाहरण के लिए, यदि आप उर्फ के ls
लिए थे ls -la
, तो टाइपिंग वास्तव में कमांड लाइन पर निष्पादित ls foo bar
होगी ।ls -la foo bar
यदि आप चाहते हैं कि तर्कों की व्याख्या कैसे की जाए, तो आप वास्तविक नियंत्रण रख सकते हैं, तो आप इस तरह से एक फ़ंक्शन लिख सकते हैं:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
उपनाम समाधान
यदि आप वास्तव में प्रति से किसी फ़ंक्शन का उपयोग करने के खिलाफ हैं, तो आप उपयोग कर सकते हैं:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
आप बदल सकते हैं $@
साथ $1
ही आप केवल पहला तर्क चाहते हैं।
व्याख्या
यह एक अस्थायी फ़ंक्शन बनाता है f
, जो तर्कों को पारित किया जाता है।
उपनाम के तर्क केवल अंत में पारित किए जाते हैं। ध्यान दें कि f
उपनाम के बहुत अंत में कहा जाता है।
unset -f
को हटा उपनाम के रूप में समारोह परिभाषा निष्पादित किया जाता है तो यह बाद में चारों ओर लटका नहीं करता है।
wrap_args x y z
मुझे देता है: मार: अप्रत्याशित टोकन के पास वाक्यविन्यास त्रुटि `('
f
अलियास किया था । एक बार जब मैंने इसका उपयोग नहीं किया तो f
यह ठीक काम करता है। पुराना नाम टक्कर की बात।
command type f
:)
वर्तमान उत्तरों को जोड़ते हुए, एक महत्वपूर्ण बात यह महसूस करने के बारे में है कि उपनाम कैसे काम करते हैं, जो कि एक अलियास कमांड के बाद आपके द्वारा लिखे गए सभी मापदंडों का शाब्दिक उपयोग किया जाएगा। तो दो आदेशों के लिए उर्फ का उपयोग करने का कोई तरीका नहीं है (पाइप्ड या नहीं), जिसमें से पहले को मापदंडों की व्याख्या करनी चाहिए। इसे स्पष्ट करने के लिए, यहाँ कुछ ऐसी चीज़ों का उदाहरण दिया गया है जो उम्मीद के मुताबिक काम नहीं करेंगी:
alias lsswp="ls -l | grep swp"
( इस प्रश्न से प्रेरित एक उदाहरण ) यह हमेशा वर्तमान निर्देशिका ls -l
में किए गए आउटपुट का उपयोग करेगा और उस पर एक grep करेगा - इसलिए उपयोग करना
lsswp / tmp /
के बराबर होगा ls -l | grep swp /tmp/
और नहीं ls -l /tmp/ | grep swp
।
सभी उद्देश्यों के लिए जहां तर्कों को बीच में कहीं इस्तेमाल किया जाना चाहिए, किसी को function
इसके बजाय उपयोग करने की आवश्यकता है alias
।
आपको वास्तव में कुछ भी करने की ज़रूरत नहीं है; उपनाम अपने आप ऐसा करते हैं। उदाहरण के लिए:
$ alias less="less -eirqM"
$ less foo.txt
आप foo.txt का पहला पृष्ठ देखेंगे, और less
EOF (-ई) पर छोड़ देंगे, खोजें केस-असंवेदनशील (-आई) होंगी, आदि।
मैं csh के लिए जवाब दे रहा हूं:
हां, आप उपनामों में मापदंडों का उपयोग कर सकते हैं और - ऊपर बताए गए अंतर के रूप में - आप उन्हें उपनाम की परिभाषा में कहीं भी संदर्भित कर सकते हैं - न केवल अंत में।
उदाहरण के लिए कुछ-टार्ज़-गिंग:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, कहां !:1
और !:2
क्या पैरामीटर हैं जो आप अपने उपनाम को कॉल करते समय आपूर्ति करेंगे।
उपयोग का उदाहरण:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
जिसका प्रभावी रूप से मतलब है कि आपने दो मापदंडों का उपयोग किया है जो आपने टार कमांड के मनमाने स्थानों पर डाला था, यह सभी का एक उपनाम है tgz
sh
परिभाषित हैंmy_program_wrapper() { ...; }
। बैश कीवर्ड संभालता हैfunction
लेकिन अधिक पोर्टेबल के साथ क्यों नहीं जाता है?