बैश के लिए एक उपनाम में कई आदेश


210

मैं एक उपनाम को परिभाषित करना चाहता हूं जो निम्नलिखित दो आदेशों को लगातार चलाता है।

gnome-screensaver
gnome-screensaver-command --lock

अभी मैंने जोड़ा है

alias lock='gnome-screensaver-command --lock'

मेरे .bashrc के लिए, लेकिन जब से मैं अपने कार्य केंद्र को बंद करता हूं, तो अक्सर यह सिर्फ एक कमांड टाइप करना आसान होगा।

जवाबों:


390

प्रयत्न:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

या

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

अपने .bashrc में

दूसरा समाधान आपको तर्कों का उपयोग करने की अनुमति देता है।


7
"फंक्शन लॉक () {ब्लाह}" नहीं होना चाहिए?
पन्नाध्वज

2
आप तर्क कैसे पारित करते हैं? अंदर नेस्टिंग चर 'संदेश' lock()कोष्ठक त्रुटि देता है syntax error near unexpected token msg'` ..
geotheory

8
एक बार फ़ंक्शन को परिभाषित करने के बाद, यह एक कमांड की तरह व्यवहार करता है: कमांड लाइन पर तर्क व्हाट्सएप द्वारा अलग किए जाते हैं। डिक्लेरेशन पार्ट पर, दलीलें हैं $1, $2... फंक्शन बॉडी में।
मौविसील

1
Params के साथ उपनाम रेखा को शामिल नहीं करने के लिए डाउनवोट।
फिलिप रीगो

2
@PhilipRego - मुझे आपसे सीखकर और आपके उत्तर को प्रसन्न करने में खुशी होगी।
मौविइल

79

अन्य उत्तर पर्याप्त रूप से प्रश्न का उत्तर देते हैं, लेकिन आपका उदाहरण ऐसा लगता है जैसे दूसरा आदेश पहले वाले के सफलतापूर्वक बाहर निकलने पर निर्भर करता है। आप अपने उपनाम में शॉर्ट-सर्किट मूल्यांकन की कोशिश करना चाहते हैं :

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

अब दूसरी कमांड का भी प्रयास नहीं किया जाएगा जब तक कि पहला सफल न हो। इस SO प्रश्न में शॉर्ट-सर्किट मूल्यांकन का बेहतर वर्णन किया गया है ।


5
हैरानी की बात है, के साथ इस की कोशिश की git fetch && git pull origin masterऔर मेरे लिए काम नहीं किया जब तक मैं के &&साथ बदल दिया ;
हकुनिन

3
शायद इसलिए क्योंकि git लाने पर 0 के अलावा कुछ और मिलता था?
रोबू

मदद की! मेरे लिए Xubuntu 16.04.3 पर काम करना
फर्नांडो लियोन

Params के साथ उपनाम रेखा को शामिल नहीं करने के लिए डाउनवोट।
फिलिप रीगो

18

उपनाम के लिए हैं aliasing आदेश के नाम। इससे परे कुछ भी कार्यों के साथ किया जाना चाहिए।

alias ll='ls -l' # The ll command is an alias for ls -l

उपनाम ऐसे नाम हैं जो अभी भी मूल नाम के साथ जुड़े हुए हैं। llबस थोड़ा विशिष्ट प्रकार का है ls

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

एक फ़ंक्शन एक नया कमांड है जिसमें आंतरिक तर्क हैं। यह बस एक और कमांड का नाम नहीं है। यह आंतरिक संचालन करता है।

तकनीकी रूप से, बैश शेल भाषा में उपनाम इतनी क्षमताओं में सीमित हैं कि वे किसी भी चीज़ के लिए बेहद बीमार हैं, जिसमें एक से अधिक कमांड शामिल हैं । एक ही आदेश के एक छोटे से उत्परिवर्तन बनाने के लिए उनका उपयोग करें, अधिक कुछ नहीं।

चूंकि इरादा एक नई कमांड बनाने का है जो एक ऑपरेशन करता है जो आंतरिक रूप से अन्य कमांड्स में हल करेगा, यहां एक फ़ंक्शन का उपयोग करने का एकमात्र सही उत्तर है:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

इस तरह से परिदृश्य में उपनामों का उपयोग बहुत सारे मुद्दों में चलता है। फ़ंक्शंस के विपरीत, जिन्हें कमांड के रूप में निष्पादित किया जाता है, उपनामों को वर्तमान कमांड में विस्तारित किया जाता है, जो अन्य कमांड के साथ इस उपनाम "कमांड" को जोड़ते समय बहुत अप्रत्याशित मुद्दों को जन्म देगा। वे स्क्रिप्ट में भी काम नहीं करते हैं।


यह सबसे अच्छा होगा यदि आप अपने उत्तर के साथ कोई उदाहरण प्रदान कर सकें। अद्यतन की प्रतीक्षा कर रहा है।
साजिद अली

1
Params के साथ उपनाम रेखा को शामिल नहीं करने के लिए डाउनवोट।
फिलिप रीगो

2
@PhilipRego उपनाम पैरामीटर नहीं लेते हैं। नारंगी न होने के लिए सेब को मत काटो। इसकी जगह एक संतरा खाएं। जैसा कि उत्तर बहुत अच्छी तरह से समझाता है, यहाँ सही उपकरण उपनाम नहीं है, लेकिन कार्य करता है।
लहुनाथ

मेरा मतलब है इस तरह के पैरामीटर। मैं नेस्टेड कोट्स का गलत इस्तेमाल कर रहा था। उर्फ = "प्रतिबद्ध Git मी 'init'; Git धक्का; Git स्थिति"
फिलिप रेगो

@PhilipRego आपको वास्तव में एक फ़ंक्शन का उपयोग करने की आवश्यकता है, न कि एक उपनाम। gps() { git commit -m 'init '; git push; git status; } जैसा कि समझाया गया है, उपनाम बेहद सीमित हैं, नाजुक हैं और उनका एकमात्र उद्देश्य आज्ञाओं का नाम बदलना है। असंबंधित उद्देश्यों के लिए उनका दुरुपयोग करना आपको गर्म पानी में उतारेगा, जैसे कि आपने अभी अनुभव किया है।
लुननाथ 21:19


4

यह एक के बाद एक 2 कमांड चलाएगा:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

इसलिए एक अर्ध-उपनिवेश का उपयोग करें:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

यदि आप पहले कमांड पर तर्क देना चाहते हैं तो यह अच्छी तरह से काम नहीं करता है। वैकल्पिक रूप से, अपने घर / बिन निर्देशिका में एक तुच्छ स्क्रिप्ट बनाएं।


0

11 साल पुरानी चर्चा में मेरे 2 सेंट जोड़ने की कोशिश करें:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

इस फ़ंक्शन को अपने में जोड़ें ~/.bashrcऔर अपने टर्मिनल को पुनरारंभ करें या चलाएंsource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

इस तरह जब भी आप lockअपने टर्मिनल में प्रवेश करेंगे, ये दोनों कमांड चलेंगे ।

आपके विशिष्ट मामले में एक aliasकाम हो सकता है, लेकिन मैं इसकी सिफारिश नहीं करता। सहज रूप से हम सोचते हैं कि एक अन्य का मान उसी तरह चलेगा जैसे आपने टर्मिनल में मूल्य दर्ज किया था। हालाँकि ऐसा नहीं है:

उपनाम की परिभाषा और उपयोग से संबंधित नियम कुछ भ्रामक हैं।

तथा

लगभग हर उद्देश्य के लिए, शेल कार्यों को उपनामों पर पसंद किया जाता है।

तो जब तक आप के लिए एक उपनाम का उपयोग न करें। https://ss64.com/bash/alias.html


-3

एलियास घोषित करते समय मैं एक समस्या में आ गया ~/.bashrc। मेरे टर्मिनल ने मेरे द्वारा घोषित उपनामों को नहीं पहचाना ~/.bashrc। मैंने लेख (नीचे से जुड़ा हुआ) से सीखा कि मैक ओएस एक्स login-shellडिफ़ॉल्ट रूप से चलता है इसलिए यह ~/.bash_profileइसके बजाय कॉल करता है ~/.bashrc

क्या आपको अपने उपनाम घोषित करने में इसी समस्या में आना चाहिए, आप समस्या को हल करने के लिए निम्न लिंक का उल्लेख कर सकते हैं:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


यह क्यूए एक उपनाम में कई आदेशों के बारे में है, जहां उपनामों को रखने के लिए नहीं ।
फेस

मैं हमेशा source .bashrcफ़ाइल में परिवर्तन सहेजने के बाद प्रदर्शन करता हूं , ताकि उर्फ ​​को लॉग आउट किए बिना पहचाना जा सके।
स्कॉट फ्लेमिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.