आप केवल sudo
शेल कमांड के सामने नहीं टिक सकते हैं , आपको उस कमांड का फिर से मूल्यांकन करने के लिए एक शेल इनवॉइस करना होगा (वैरिएबल का विस्तार करना, रीडायरेक्ट ऑपरेटर्स के लिए फाइल खोलना, जैसी चीजें करना)। तो यह है
sudo bash -c !!
सिवाय इसके कि यह काफी काम नहीं करता है, क्योंकि !!
पिछले कमांड, विशेष वर्णों और सभी के पाठ को इंटरपोल करता है। आपको कमांड के पाठ को एक स्ट्रिंग के रूप में पुनः प्राप्त करने और तर्क के रूप में पास करने की आवश्यकता है sh
। सौभाग्य से, पार्टी के fc
builtin आप that¹ काम करने दिया।
sudo bash -c "$(fc -ln -1)"
या फिर, बैश के उसी संस्करण को लागू करना सुनिश्चित करें जो वर्तमान में चल रहा है:
sudo "$BASH" -c "$(fc -ln -1)"
ध्यान दें कि चूंकि कमांड को एक अलग शेल प्रक्रिया में निष्पादित किया जाता है, इसलिए इसमें पर्यावरण चर (केवल वे ही होते हैं जो sudo
संरक्षित करते हैं, मन), लेकिन आंतरिक चर नहीं खोलते हैं। शेल विकल्प (जैसे kshglob
) और अन्य सेटिंग्स या तो डिफ़ॉल्ट से शुरू होंगी।
एक ही कमांडो zsh और ksh में काम करता है, हालाँकि ATT ksh93 को to first
और last
नंबर दोनों को पास करने की आवश्यकता होती है fc
(जो कि bash, zsh और pdksh / mksh में भी काम करता है):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0
रनिंग शेल के निष्पादन योग्य को नामित करने के लिए उपयोग करना केवल तभी होता है जब शेल को $ PATH और $ PATH द्वारा परिवर्तित नहीं किया गया हो या निरपेक्ष पथ के माध्यम से किया गया हो।
यहाँ zsh में एक और तरीका है जो थोड़ा स्पष्ट है लेकिन अधिक लंबा है:
sudo zsh -c $history[$[HISTCMD-1]]
चेतावनी का एक अंतिम शब्द: sudo
संभावित खतरनाक आदेशों के लिए है। इसे उपयोग करने के लिए बहुत आसान मत बनाओ!
¹ शुरुआत में कुछ अतिरिक्त व्हाट्सएप है और कमांड प्रतिस्थापन अंत में newlines से स्ट्रिप्स करता है, लेकिन शेल का सिंटैक्स इसकी परवाह नहीं करता है।
B मुझे नहीं लगता कि zsh या ksh के पास बैश जैसा कुछ भी है $BASH
; $0
केवल तभी काम करता है जब यह एक निरपेक्ष पथ हो, या जब इसमें कोई स्लैश न हो और कमांड खोज पथ परिवर्तित नहीं हुआ हो।
AT ATT ksh में एक उपनाम है लेकिन यह उतना ही अच्छा है। fc
hist