एलियास के बिना सिर्फ एक लाइन में अनुक्रम के दोनों आदेशों को निष्पादित करने apt up
के लिए apt update
और apt upgrade
कमांड के भाग का पुन: उपयोग कैसे करें ।
की तरह कुछ: apt up{date,grade}
।
एलियास के बिना सिर्फ एक लाइन में अनुक्रम के दोनों आदेशों को निष्पादित करने apt up
के लिए apt update
और apt upgrade
कमांड के भाग का पुन: उपयोग कैसे करें ।
की तरह कुछ: apt up{date,grade}
।
जवाबों:
सरल तरीका (और अधिक कुशल) लूप के लिए है (एक पंक्ति पर लेकिन यहाँ यह स्पष्टता के लिए कई लाइनों में दिखाया गया है):
for i in {date,grade}; do
apt up${i}
done
स्मार्ट तरीका यह है कि आप ~/.bashrc
इन दो आदेशों के लिए एक उपनाम बनाएं और इसे फिर से पुन: प्राप्त करने के बारे में भूल जाएं:
alias upgrade=' sudo apt update && sudo apt upgrade'
यह करने के लिए विस्तृत तरीका है:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
देखिये क्या हो रहा है? हम शेल द्वारा चलाए जाने वाले पाठ का एक वैध स्ट्रिंग बना रहे हैं। अब आपको केवल eval
इसके बजाय उपयोग करने की आवश्यकता है echo
। लेकिन eval
आम तौर पर शेल स्क्रिप्टिंग में अनुशंसित नहीं किया जाता है और लूप के लिए यह कमांड बहुत अधिक जटिल और गैर पोर्टेबल है। Eval के बिना थीम पर भिन्नता (और अब तक की सबसे छोटी, लेकिन पाइप और कई कमांड echo
, दो apt
, sudo
और sh
इतने सारे फोर्किंग के कारण कुशल नहीं ):
$ echo "apt "{update,upgrade}";"|sudo sh
हम यह भी उपयोग कर सकते हैं set
स्थितीय मापदंडों में वांछित अनुक्रम चालू करने के लिए और बस पर अमल apt
के साथ $1
और $2
आर्ग:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
या वैकल्पिक रूप से फिर से लूप के लिए उपयोग करें, क्योंकि यह स्थितिगत मापदंडों को संसाधित करने में चूक करता है यदि आप एक अनुक्रम निर्दिष्ट नहीं करते हैं for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
का उपयोग करना set
एक बहुत ही सामान्य तकनीक है जो मैं ऐसे पेशेवरों के बीच देखता हूं जो बहुत से शेल के साथ काम करते हैं, और एक अच्छे कारण के लिए - यह बहुत पोर्टेबल है और /bin/sh
जहां आप कोई सरणियां या {a,b,c}
विस्तार नहीं करते हैं, वहां काम करेंगे । तो POSIX-ly पोर्टेबल तरीका होगा set update upgrade ; for i; do echo apt $i ;done
। इसके अतिरिक्त, यह कुशल होना चाहिए।
या हम while
पाश मार्ग पर जा सकते हैं :
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
बेशक, इसे चलाने के echo
लिए वास्तविक कमांड निष्पादन के बिना याद रखें
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
भी रख सकते हैं। इस फ़ाइल को स्वचालित रूप से द्वारा सॉर्ट किया जाना चाहिए ~/.bashrc
।
apt
कमांड है) अलग-अलग तर्क (अपडेट और अपग्रेड) के साथ, इसलिए मैं अभी भी कहूंगा कि लूप जाने का रास्ता है
for i in date grade; do
upgrate
।
आप वर्तमान कमांड लाइन के कुछ हिस्सों को प्राप्त करने और इसे संशोधित करने के लिए bash इतिहास विस्तार का उपयोग कर सकते हैं :
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
वर्तमान लाइन है:s/date/grade
एक ऐसा संशोधक है जो स्थानापन्न date
करता हैgrade
!#:s/dat/grad
बजाय का उपयोग करके कर सकते हैं
xargs
इसके बजाय का उपयोग कर एक और सरल विकल्प for
:
echo up{dat,grad}e | xargs -n1 apt
परीक्षा:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
हालाँकि, मैं सर्जियों की तरह एक शेल उर्फ पसंद करूंगा क्योंकि ये "सरल" तरीके वास्तव में उपयोगी होने के लिए पर्याप्त सरल नहीं हैं।
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
हालांकि यह थोड़ी लंबी हो सकती है
printf '%s'
आम तौर पर अच्छा अभ्यास है क्योंकि आप इससे बच नहीं सकते हैं, उदाहरण के लिए --help
या साथ -e
।
printf '%s\0'
बेहतर भी होगा, xargs
अशक्त समाप्त होने वाले आर्गों को संभालने के लिए एक ध्वज है
इस तरह एक समारोह बनाएँ:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
तब तुम दौड़ सकते हो repeat 'apt up' {date,grade}
। यह पूरी तरह से अलग आदेशों के लिए पुन: प्रयोज्य होने का लाभ है, हालांकि यह आपको इसके लिए कोई टाइपिंग नहीं बचा रहा है।
मैं निश्चित रूप से कुछ अन्य जवाबों से सहमत हूं कि ऐसा कुछ संभवतः अधिक उपयोगी है:
alias apt-up='apt update && apt upgrade'
@ मौरू के जवाब ने मुझे इतिहास विस्तार पर पढ़ने के लिए प्रेरित किया और मुझे एक और संस्करण मिला
$ sudo apt update
$ ^dat^grad^
^string1^string2^
के बराबर है !!:s/string1/string2/
, जो अंतिम आदेश लेता है और उसके string1
साथ बदलता है string2
।