विम के अंदर से जड़ बनना


72

कभी-कभी मैं /etcविम का उपयोग करके कॉन्फ़िगरेशन फ़ाइलों को संपादित करना शुरू करता हूं , लेकिन sudoविम को शुरू करने के लिए उपयोग करना भूल जाता हूं । तब अपरिहार्य परिणाम यह होता है कि अपने संपादन समाप्त करने के बाद, मुझे खतरनाक सूचना मिलती है कि मेरे पास फ़ाइल को बचाने की अनुमति नहीं है।

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

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


1
मुझे सभी व्यवस्थापक संपादन के sudoeditबजाय उपयोग करने की आदत पड़ गई vim। यह इस समस्या में अब और नहीं चलाने का एक तरीका है :)। गाइल्स के जवाब के लिए +1 ।
jw013

एसओ से ये अल्टरनेटिव Q & A उपयोगी हैं इसलिए इन्हें यहां लिंक करना: vi के अंदर किसी फाइल पर रूट परमिशन प्राप्त करना? & Vim "sudo के साथ कैसे लिखें" ट्रिक काम करती है?
स्लम

जवाबों:


46

सुडो मौजूदा प्रक्रिया के प्रभावी उपयोगकर्ता को बदल नहीं सकता है, यह हमेशा एक नई प्रक्रिया बनाता है जिसमें उन्नत विशेषाधिकार होते हैं और मूल शेल अप्रभावित रहता है। यह UNIX डिजाइन का एक मौलिक है। मैं अक्सर केवल वर्कअराउंड के रूप में फाइल को / tmp में सेव करता हूँ। यदि आप वास्तव में इसे सीधे बचाना चाहते हैं, तो आप विम की एक सुविधा का उपयोग करने का प्रयास कर सकते हैं जहां यह एक फाइल को किसी अन्य प्रक्रिया में पाइप कर सकता है। इस आदेश के साथ बचत करने का प्रयास करें:

:w !sudo dd of=%

परीक्षण किया और काम करता है। विम तो आपको फ़ाइल को फिर से लोड करने के लिए कहेंगे, लेकिन यह अनावश्यक है: आप oअपने पूर्ववत इतिहास को फिर से लोड करने और खोने से बचने के लिए दबा सकते हैं । आप इसे वीम कमांड / फंक्शन में भी सेव कर सकते हैं या इसे आसान एक्सेस के लिए एक कुंजी से बाँध सकते हैं, लेकिन मैं इसे पाठक के लिए एक अभ्यास के रूप में छोड़ दूँगा।


2
यह एक दिलचस्प समाधान है, लेकिन आप उस पथ को प्रतिस्थापित कर सकते हैं %, जो वर्तमान में आपके द्वारा संपादित की जा रही फ़ाइल का पथ होगा।
रीड

यदि %फ़ाइल नाम में कोई स्थान है, तो आपको उद्धरण चिह्नों में लपेटना चाहिए ।
intuited

भी: यह 'modified'सेटिंग रीसेट नहीं करेगा ; आप ऐसा मैन्युअल रूप से कर सकते हैं set nomodified
intuited

2
वास्तव में, यदि आप वास्तव में सावधान रहना चाहते हैं, तो आपको exec 'w !sudo dd of=' . shellescape(expand('%'))उस मामले में करना चाहिए जिसमें फ़ाइल नाम में उद्धरण, बैकस्लैश, डॉलर-संकेत आदि शामिल हैं
अंतर्वासित

पट्टिकाओं द्वारा कमांडलाइनफू -कमांड के लिए यह अलग कैसे है?

36

फ़ाइल को रूट के रूप में सहेजना:

: w! सुडो टी%


13

sudoeditरूट के रूप में फ़ाइलों को संपादित करने के लिए कॉल करें।

vimसीधे चेतावनी के रूप में कॉल करते समय असुविधा के बारे में सोचें कि आप संभावित रूप से खतरनाक कुछ करने में बहुत आकस्मिक हो रहे हैं।


8

इसे आप अपने अंदर डाल सकते हैं .vimrc

cmap w!! %!sudo tee > /dev/null %

आप इसे करके ट्रिगर करते हैं :w!!- यह फ़ाइल sudo teeको वर्तमान फ़ाइल नाम ( %) के माध्यम से धकेल देगा ।

से https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks


और यदि आपने अधिक थाल स्थापित किए हैं, तो !sudo sponge %इसके बजाय उपयोग करें ।
17

3

यह भी अच्छी तरह से काम करता है:

:w !sudo sh -c "cat > %"

यह इस उत्तर में @ नथन लोंग की टिप्पणी से प्रेरित है ।

सूचना :

"इसके बजाय इसका उपयोग किया जाना चाहिए 'क्योंकि हम %शेल में जाने से पहले विस्तारित होना चाहते हैं ।

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