'Apt up` का हिस्सा `apt update` का हिस्सा और` apt उन्नयन` को केवल एक पंक्ति में क्रम से निष्पादित करने के लिए कमांड


11

एलियास के बिना सिर्फ एक लाइन में अनुक्रम के दोनों आदेशों को निष्पादित करने apt upके लिए apt updateऔर apt upgradeकमांड के भाग का पुन: उपयोग कैसे करें ।

की तरह कुछ: apt up{date,grade}


वास्तव में इसे प्राप्त करने का उद्देश्य क्या होगा? यह दिलचस्प / प्रासंगिक क्यों हो सकता है?
वैनेडियम

25
@vanadium हम लिनक्स उपयोगकर्ता हैं, निरर्थक चीजों की कोशिश करने से हम उन तकनीकों को सीखने की अनुमति देते हैं जो बाद में अधिक जटिल चीजों पर लागू की जा सकती हैं, अगर हममें से किसी ने भी कभी नहीं किया कि चलो हम में से कोई भी ईमानदार नहीं होगा
डैरेन एच

1
@ डेरेनह वही है जो मैंने वास्तव में सोचा था :-)
वैनेडियम

जवाबों:


19

सरल तरीका (और अधिक कुशल) लूप के लिए है (एक पंक्ति पर लेकिन यहाँ यह स्पष्टता के लिए कई लाइनों में दिखाया गया है):

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लिए वास्तविक कमांड निष्पादन के बिना याद रखें


7
बस एक पंक्ति में लूप के लिए करें। for i in {date,grade}; do sudo apt up${i}; done
वीडियोनौथ

3
यदि आप अपनी फ़ाइलों को अच्छा और सुव्यवस्थित रखना पसंद करते हैं, तो आप उपनाम ~/.bash_aliasesभी रख सकते हैं। इस फ़ाइल को स्वचालित रूप से द्वारा सॉर्ट किया जाना चाहिए ~/.bashrc
francescop21

2
मैंने अपना उत्तर अपडेट कर दिया है कि आप क्या चाहते हैं। यह वन-लाइनर है, लेकिन मुझे नहीं लगता कि यह इसे आसान बनाता है। सच कहूं, तो ऐसा करने का कोई मतलब नहीं है जब आप दो कमांड चलाना चाहते हैं (हां, यह दो aptकमांड है) अलग-अलग तर्क (अपडेट और अपग्रेड) के साथ, इसलिए मैं अभी भी कहूंगा कि लूप जाने का रास्ता है
सर्जि कोलोडियाज़नी

1
लूप हेडर के लिए स्ट्रिंग विस्तार की आवश्यकता नहीं है, बस पुनरावृत्तियों को नाम दें:for i in date grade; do
rexkogitans

5
इस तरह के उपनाम को स्पष्ट रूप से नामित किया जाना चाहिए upgrate
पाइप

14

आप वर्तमान कमांड लाइन के कुछ हिस्सों को प्राप्त करने और इसे संशोधित करने के लिए bash इतिहास विस्तार का उपयोग कर सकते हैं :

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# वर्तमान लाइन है
  • :s/date/gradeएक ऐसा संशोधक है जो स्थानापन्न dateकरता हैgrade

6
तुम भी 2 और पात्रों को बचाने के !#:s/dat/gradबजाय का उपयोग करके कर सकते हैं
दान

9

xargsइसके बजाय का उपयोग कर एक और सरल विकल्प for:

echo up{dat,grad}e | xargs -n1 apt

परीक्षा:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

हालाँकि, मैं सर्जियों की तरह एक शेल उर्फ ​​पसंद करूंगा क्योंकि ये "सरल" तरीके वास्तव में उपयोगी होने के लिए पर्याप्त सरल नहीं हैं।


1
बहुत अच्छा। विषय पर भिन्नता printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%हालांकि यह थोड़ी लंबी हो सकती है
सर्जियो कोलोडियाज़नी

printf '%s'आम तौर पर अच्छा अभ्यास है क्योंकि आप इससे बच नहीं सकते हैं, उदाहरण के लिए --helpया साथ -e
yyny

@YoYoYonnY हां शायद printf '%s\0'बेहतर भी होगा, xargsअशक्त समाप्त होने वाले आर्गों को संभालने के लिए एक ध्वज है
सर्गिय कोलोडियाज़नी

2

इस तरह एक समारोह बनाएँ:

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

तब तुम दौड़ सकते हो repeat 'apt up' {date,grade}। यह पूरी तरह से अलग आदेशों के लिए पुन: प्रयोज्य होने का लाभ है, हालांकि यह आपको इसके लिए कोई टाइपिंग नहीं बचा रहा है।

मैं निश्चित रूप से कुछ अन्य जवाबों से सहमत हूं कि ऐसा कुछ संभवतः अधिक उपयोगी है:

alias apt-up='apt update && apt upgrade'

0

@ मौरू के जवाब ने मुझे इतिहास विस्तार पर पढ़ने के लिए प्रेरित किया और मुझे एक और संस्करण मिला

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^के बराबर है !!:s/string1/string2/, जो अंतिम आदेश लेता है और उसके string1साथ बदलता है string2


-2

मैं apt-get upनिम्नलिखित प्रमुख अनुक्रम का उपयोग करके कमांड के भाग को अस्वीकार करता हूं :

Up ArrowBackspaceBackspaceBackspaceBackspace

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