अनुमतियों के बिना खोले जाने पर फ़ाइल को संपादित करने के लिए विम का उपयोग करना


51

मैं एक फ़ाइल को संपादित करने के लिए विम का उपयोग करता हूं। कभी-कभी, मैं उचित अनुमतियाँ रखना भूल जाता हूँ। मैं vim और फ़ाइल को केवल पढ़ने के लिए फ़ाइल के रूप में चलाता हूं। मैं बदलाव कर सकता हूं, लेकिन मैं वास्तव में बदलाव नहीं लिख सकता। हर बार एक समय में, मैं एक फ़ाइल खोलना और उसमें परिवर्तन करना समाप्त करता हूं, यह महसूस करता हूं कि मैंने इसे sudo में नहीं चलाया था, अपने आप को चीखता हूं, और फिर इसे छोड़ने और इसे फिर से मूल उपयोगकर्ता के रूप में खोलने के लिए मजबूर करता हूं।

क्या इसके आसपास कोई कार्य है? क्या मैं फ़ाइल के केवल पढ़ने की स्थिति के बावजूद फ़ाइल में परिवर्तन को बाध्य कर सकता हूँ? क्या मैं कम से कम परिवर्तनों को सहेज सकता हूं, एक अंतर चला सकता हूं, और फाइलों को एक साथ मर्ज कर सकता हूं?


3
यह सवाल पहले से ही यहाँ उत्तर दिया गया लगता है: stackoverflow.com/questions/1005/…
शरद ऋतु

मैं क्षमाप्रार्थी हूं। मुझे वह प्रतिक्रिया नहीं मिली। धन्यवाद।
केसलमैन

3
डब्ल्यू sudo टी% [1]: [sudo चाल के साथ विम लिखने] [1] का प्रयोग करें! Stackoverflow.com/questions/2600783/...
मैटिस Aslund

जवाबों:


81

आपकी वर्तमान समस्या के आधार पर कुछ भिन्न दृष्टिकोण हैं:

  1. केवल पढ़ने के लिए vi द्वारा। आपकी फ़ाइल है, तो :set readonlyआप कर सकते हैं
    • :w!लिखने को मजबूर करने के लिए उपयोग करें , या
    • समस्या :set noreadonlyऔर फिर सामान्य का उपयोग करें:w
  2. एक अनुमति समस्या ( sudo ): आप नहीं लिख सकते हैं लेकिन आपके पास sudo अधिकार हैं।
    • जारी करें: :w !sudo tee %। यह बफर को लिखेगा tee, एक कमांड जो पाइप की जानकारी प्राप्त करता है और फाइलों में लिख सकता है। और जैसा कि टी को सुडो शक्तियों के साथ चलाया जाता है, टी फाइल को संशोधित कर सकता है।
  3. एक अनुमति समस्या ( कोई sudo ): आपके पास फ़ाइल लिखने का अधिकार नहीं है और आपके पास व्यवस्थापक पहुँच नहीं है।
    • :w! ~/tempfile.extएक अस्थायी फ़ाइल में अपने परिवर्तन लिखने के लिए उपयोग करें और फिर निर्देशिका में अस्थायी फ़ाइल को स्थानांतरित करने के लिए उपाय करें (निर्देशिका स्वामी / व्यवस्थापक को अस्थायी फ़ाइल भेजें)।

आप इसके बारे में यहां और अधिक पढ़ सकते हैं:

  1. StackOverflow से
  2. Geekyboy से
  3. डेटा आगरिक से

छोटा रास्ता

जैसा कि यह अक्सर मामला समस्या # 2 है ( अनुमति समस्या, सूडो के साथ ), आप निम्न शॉर्टकट /etc/vim/vimrc(या ~/.vimrc) अपने कर सकते हैं :

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

तो फिर तुम बस sudo शक्तियों के :w!!साथ बचाने के लिए टाइप कर सकते हैं। मैं इसे यहाँ नहीं समझाऊँगा, लेकिन ऊपर दिए गए संदर्भ कई शॉर्टकट्स को कवर करते हैं।


1
और आपके गुमनाम जैसे मैंने सिर्फ नेक्रोमैंटर बैज कमाया! धन्यवाद! मुझे लगता है कि अब मोर्डर का बचाव करना चाहिए। ;)
डॉ। बीको

5

मैं ऐसा करने के दो तरीके सोच सकता हूं।

पहला तरीका यह है कि आप फ़ाइल के मालिक हैं, लेकिन फ़ाइल पूरी तरह से है।

लिखने की कमांड (: w!) के लिए बस अपने विस्मयादिबोधक चिह्न प्रत्यय का उपयोग अपनी खुद की READONLY फ़ाइल को अधिलेखित करने के लिए करें। यह निश्चित रूप से मानता है कि आपके पास वर्तमान फ़ोल्डर में लिखने और निष्पादित करने की अनुमति है।

:w!

vi को मूल READONLY फ़ाइल को अधिलेखित करने का कारण होगा।

दूसरा तरीका यह है कि कोई अन्य व्यक्ति फ़ाइल का मालिक है, और आप उस फ़ाइल में अपने परिवर्तनों को सहेजना चाहेंगे।

इसे पूरा करने का एक तरीका यह है कि मूल फ़ाइल में किए गए परिवर्तनों को vi के भीतर से एक एड स्क्रिप्ट के रूप में सहेजा जाए। यह एड स्क्रिप्ट बाद में vi से बाहर एड लाइन एडिटर के साथ मूल फ़ाइल (या अन्य समान फ़ाइलों) पर लागू हो सकती है।

वर्तमान स्क्रिप्ट को एक एड स्क्रिप्ट के रूप में सहेजने का एक तरीका मूल फ़ाइल नाम और एडिट किए गए vi बफर को मानक इनपुट के रूप में --ed कमांड लाइन स्विच के साथ मानक उपयोगिता के रूप में पारित करना है। एक एड स्क्रिप्ट के रूप में अंतर प्रदर्शित करता है।

तो, एक संपादित vi बफर मान, तो निम्नलिखित प्रदर्शन करते हैं

:.,$!diff --ed [original_file] -

यह वर्तमान बफ़र में सभी पंक्तियों को बदलता है (!, $!), अलग-अलग जेनरेट की गई स्क्रिप्ट (diff --ed [original_file] -) के साथ मूल फ़ाइल को वर्तमान बफ़र की सामग्री में बदलने के लिए आवश्यक है। हम तब इस एड स्क्रिप्ट को सुरक्षित स्थान पर सहेजना चाहते हैं, और स्क्रिप्ट को उस मूल फ़ाइल के संस्करण में लागू कर सकते हैं जिसे हम लिख सकते हैं। इसलिए, स्क्रिप्ट को एक लिखित स्थान पर सहेजें, उदाहरण के लिए, आपका लॉगिन फ़ोल्डर:

:w ~/my_ed_script

अब vi से बाहर निकलें, और संपादित किए गए फ़ाइल को प्राप्त करने के लिए इस एड स्क्रिप्ट का उपयोग करें जिसे पहली बार में सहेजा नहीं जा सका। यहाँ है कि कैसे कमांड लाइन प्रॉम्प्ट से '' $ 'को पूरा करना है:

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

इस कमांड सीक्वेंस को शब्दों में अलग-अलग करने के लिए हमने जो स्क्रिप्ट बनाई है, उसे अलग करना है और एड लिखने के कमांड, 'w' को एड के स्टैंडर्ड इनपुट तक पहुँचाना है। एड फिर इस स्क्रिप्ट को मूल फ़ाइल की लिखने योग्य कॉपी पर लागू करता है, और उन संशोधित बफर को वापस फाइल में बदल देता है।

तो यह vi में किए गए काम को बचाने के लिए एक फ़ाइल है जो मूल रूप से vi, diff, और ed का उपयोग करके किसी और के स्वामित्व में थी।


1

जब फ़ाइल लिखने की अनुमति नहीं है तो बस केस को कवर करना चाहते हैं।

:!chmod +w %
:w!

बीच में विम फ़ाइल में परिवर्तन के बारे में शिकायत करेंगे (झंडे बदलने के कारण) - यह स्पष्ट रूप से उन्हें अनदेखा करने के लिए सुरक्षित है


0

एक अन्य संभावना, उस मामले के लिए जिसमें आपके पास sudo विशेषाधिकार नहीं हैं, का उपयोग करना है :w /somewhere/where/i/have/permissions/foo.txt, और फिर बाद में अनुमति जारी करने के मामले में रयान फॉक्स के रूप में व्यवहार करें ।

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