उसी कमांड को फिर से रन करें लेकिन रूट के रूप में


116

कभी-कभी जब मैं एक कमांड चलाता हूं तो मुझे यह ध्यान नहीं आता है कि मुझे पर्याप्त अनुमति के लिए इसे सुपर उपयोगकर्ता के रूप में चलाने की आवश्यकता है।

क्या एक ही कमांड को फिर से चलाने का एक तरीका है लेकिन एक सुपर यूजर के रूप में?

जवाबों:


195

सबसे सरल तरीका है:

sudo !!

यह अंतिम कमांड चलाएगा लेकिन सुपर उपयोगकर्ता के रूप में।

स्रोत


5
मुझे यह काफी उपयोगी लगा और मैं इसके पहले (हालांकि यह सामान्य ज्ञान हो सकता है) नहीं आया था। मुझे यह साइट पर नहीं मिला, इसलिए मैंने सोचा कि मैं इसका जवाब खुद दूंगा।
ट्रूफा

30
एक तरफ के रूप में, !!अपने दम पर निष्पादित आपकी पिछली कमांड को सहेजे गए अनुसार चलाता है history। इसके अलावा, करना !-1, !-2और इसी तरह आपकी अंतिम कमांड, दूसरी अंतिम कमांड, और इसी तरह से आपको क्रियान्वित किया जाता है। हैंडी!
oaskamay

6
एक और बात के रूप में, उस से शुरू !<command>होने वाली आखिरी घटना को अंजाम ~/.bash_historyदेंगे<command>
राडु रियडेनू

1
ctrl-r भी बहुत उपयोगी है। यह आपके इतिहास में पीछे की खोज करेगा कि आप क्या टाइप करते हैं। यह आपको फिर से चलाने से पहले कमांड को संपादित करने की अनुमति देगा
KayEss

4
इस बेवकूफी से !मारपीट की गई चीज़ tcshने मुझे उस समय से अधिक बार खराब कर दिया है, जब तक कि यह उपयोगी नहीं है। डबल कोट्स की व्याख्या से रक्षा नहीं करते हैं !$ foo "!bar"-> !bar: event not found
कज़

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​यहां छवि विवरण दर्ज करें

उत्तर : आप sudo !!एस्केलेटेड विशेषाधिकारों के साथ पिछली कमांड को दोहराने के लिए सीधे बाद में प्रवेश करते हैं।

संपादित करें: Reddit के माध्यम से मिली छवि , और यह रान्डेल मुनरो द्वारा मूल xkcd कॉमिक की एक पैरोडी है ।


3
कृपया टिप्पणियों में यहां प्रो-या-विरुद्ध वार्तालाप न करें। यदि आप योग्यता पर चर्चा करना चाहते हैं या अन्यथा, कृपया मेटा का उपयोग करें। धन्यवाद।
जीवाश्म

17

आप अपने पुराने आदेशों को स्क्रॉल करने और उन्हें फिर से लिखने / बदलने और उनके sudoसामने जोड़ने के लिए अप-एरो की कोशिश कर सकते हैं। (तीर कुंजियों के ऊपर स्थित होम बटन शुरुआत की स्थिति निर्धारित करेगा।)

मैं इस sudo !!विचार को नापसंद करता हूं , क्योंकि कभी-कभी आप एक और कमांड जोड़ते हैं और अब याद नहीं करते।


1
सौभाग्य से, जब आप करते हैं sudo !!, तो शेल का विस्तार होगा !!ताकि आप देख सकें कि यह किस कमांड को चलाने की कोशिश कर रहा है। तो, यह Ctrl-C को हिट करने और सही कमांड खोजने के लिए परेशान हो सकता है, लेकिन यह कम से कम आपको अनजान नहीं लगेगा।
रीड

4
@ रीइड दर्ज करने के बाद तक इसका विस्तार नहीं होगा , और यदि आप उस विंडो के भीतर हैं जहां आपको अपना पासवर्ड दोबारा दर्ज नहीं करना है, तो यह बिना पुष्टि के चलेगा। +1 !!
नेत्रहीन

5
@ इज़काता: मुझे लगता है कि यह सच है। मैं zsh का उपयोग करता हूं, इसलिए मैं सिर्फ टाइप करता हूं sudo !!<TAB>और यह !!मेरे लिए ऑटोकंप्लीट करता है। बैश इतिहास का M-^मेरे साथ विस्तार कर सकता है (alt + Shift + 6), लेकिन यह कम धाराप्रवाह है (आप इसे फिर भी शुरू कर सकते हैं, हालांकि)। ऐसा भी है shopt -s histverify, जो इसे ऐसा बनाता है कि जब आप इतिहास के विस्तार और हिट दर्ज का उपयोग करते हैं, तो यह आपको दिए गए विस्तार के साथ एक और त्वरित पंक्ति देता है जिससे आप इसे देख / संपादित कर सकें।
रीड

1
मैं उस स्थिति के बारे में अधिक सोच रहा था जहां मैंने एक कमांड टाइप किया था, कमांड ने उस अनुमति को अस्वीकार कर दिया था, और मुझे पता है कि मैं इस सटीक कमांड को फिर से चलाना चाहता हूं लेकिन sudo के रूप में, प्रेस करने की प्रक्रिया, घर, टाइपिंग sudo और बहुत कुछ महसूस करता है मेरे लिए धीमा। यह ऐसा तरीका है जिसे मैं हमेशा से करता आ रहा हूं और यह सिर्फ अक्षमता महसूस करता है।
ट्रूफा

@ रीड: shopt -s histverifyएक बिट की मदद नहीं करेगा। ज्यादातर लोगों को Enterदो बार मारने की आदत होगी । उस बिंदु पर, उन्हें यह जांचने के लिए अभी भी बहुत देर हो चुकी है कि क्या हुआ।
फ्रैंक केल्स

13

मैं सिर्फ एक विकल्प जोड़ूंगा: टाइपिंग जितना छोटाsudo !! और अधिक लचीला:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

यह वास्तव में कीस्ट्रोक्स की समान संख्या है (मैं "ctrl + A" को एक के रूप में गिनता हूं ...), लेकिन "अप एरो" को जोड़ने से आप इसे अपने इतिहास में जो भी कर सकते हैं।


1
ctrl + A emacs बाइंडिंग से है, आप vi बाइंडिंग ( set -o vi) का भी उपयोग कर सकते हैं । फिर आप बच सकते हैं (कमांड मोड पर जाएं), और फिर 'आई' (राजधानी 'आई', लाइन की शुरुआत में डालें)।
गेरहार्ड बर्गर

1
@GerhardBurger: मुझे पता है, लेकिन, अजीब तरह से, मैं बहु-पंक्ति दस्तावेजों के संपादन के लिए vi (विशेष रूप से विम) से प्यार करता हूं , लेकिन मैं शेल में बाध्यकारी emacs को बहुत पसंद करता हूं (शेल से मोड को संपादित करने के लिए कमांड से स्विच करने की आवश्यकता नहीं है) वास्तव में समझ में आता है, imo, और emacs के शॉर्टकट रोजमर्रा के उपयोग के लिए काफी पर्याप्त हैं, भले ही कम शक्तिशाली हो)
ओलिवियर दुलक

यह सच है, मैंने इसे पूर्णता के लिए जोड़ा है, मेरे लिए यह एक ही है, हालांकि मुझे '/' बहुत सुविधाजनक है;)
गेरहार्ड बर्गर

@GerhardBurger: vi मोड के "/" के बारे में, नियमित (emacs बाइंडिंग) बैश में भी कुछ अक्षरों को टाइप करके पिछले कमांड को खोजने का एक बहुत ही आसान तरीका है, फिर 'ctrl + r' जब तक आप इसे नहीं ढूंढ लेते
ओलिवियर जुलाक

7

ऐसा करने के कुछ तरीके हैं

  • बस कमांड को जोड़ने sudoसे पहले कमांड को फिर से दर्ज करें

  • Up arrowअंतिम कमांड प्राप्त करने के लिए दबाएं और उसके sudoसामने रखें।

  • दर्ज sudo !!

!!अंतिम में दर्ज कमांड का विस्तार। आप कमांड लाइन के इतिहास के साथ अन्य चीजों के साथ ऐसी ही चीजें यहां देख सकते हैं


7

इस सवाल को " रन एक ही कमांड लेकिन कुछ संशोधन के साथ " में सामान्यीकृत किया जा सकता था , क्योंकि यूनिक्स में शानदार डिजाइन निर्णयों में से एक यह है कि शेल में एक बार लागू होने वाले किसी भी कमांड को शेल से लागू किया जा सकता है।

दूसरे शब्दों में, यह ट्रिक सिर्फ इस पर लागू नहीं होती है sudo:

  • सुपर कमांडर ( sudo !!) के रूप में पिछला कमांड दोहराएं
  • पिछले कमांड को दोहराएं और इसे ( time !!) करें
  • पिछले कमांड को एक अलग वातावरण के साथ दोहराएं ( env A=b B=z !!)
  • पिछले कमांड को दोहराएं ( !!)

इतिहास विस्तार (इतिहास प्रतिस्थापन के रूप में भी जाना जाता है) पिछले कमांड को आसान बनाने के लिए (कम कीस्ट्रोक्स के साथ) एक शेल सुविधा है। के लिए अपना शेल मैन पेज देखें history expansion। यह कई और चालें और शॉर्ट-कट का वर्णन करता है जो आप उदाहरण के लिए इतिहास के साथ कर सकते हैं:

आप पिछले आदेशों को संख्या द्वारा संदर्भित कर सकते हैं:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

आप पिछले आदेशों में अलग-अलग शब्दों का उल्लेख कर सकते हैं:

some-command !$     # run some-command on the last arg of previous command

आप दोहराने से पहले भी खोज सकते हैं:

!?awk               # repeat the last command including the string 'awk'

आप इतिहास को खोज सकते हैं और किसी चीज़ को किसी और चीज़ से बदल सकते हैं:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

और भी बहुत कुछ, चूंकि आप कमांड चयन, arg-Selection, खोज और स्वतंत्र रूप से प्रतिस्थापित कर सकते हैं।

आपके शेल का पुरुष पृष्ठ (इस मामले में man bash) आपका मित्र है।


1
Briliant! कि एक स्वीकृत उत्तर होना चाहिए।
एलिरन मलका

5

मैं बैश के बजाय zsh का उपयोग करता हूं और मेरे पास यह है ~/.zshrc, इसलिए कमांड लाइन की शुरुआत में Alt+ Sआवेषण दबाएंsudo :

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

दुर्भाग्य से, मैं बैश में एक ही काम करने का तरीका ट्रैक नहीं कर सका।


3
आप GNU Readline का उपयोग करके बैश में आसानी से कर सकते हैं: अपने में जोड़ें ~/.inputrc "\es":"\C-asudo "और आप एक लंबी लाइन की शुरुआत में जाएंगे और दबाने पर लाइन के शुरू में sudo डाला जाएगा alt-s~/.inputrcकाम करने के लिए टर्मिनल को फिर से शुरू करें या फिर से पढ़ें ।

2

यदि आप इसे एक उपनाम में करना चाहते हैं, तो आपको alias redo='sudo $(history -p !!)'किसी कारण से उपयोग करना होगा।


1
su -c "!!"

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


1

जिस तरह से मैं इसे पसंद करता हूं:

  • तीर कुंजी ऊपर
  • घर
  • "सुडो"
  • दर्ज

लेकिन यह आसान हो सकता है कि आप केवल "सुडो !!" करें, यह आपके ऊपर है।

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