आप में से कई लोगों ने संभवतः कमांड को देखा है जो आपको एक फाइल पर लिखने की अनुमति देता है, जिसे रूट अनुमति की आवश्यकता होती है, तब भी जब आप sudo के लिए vim खोलना भूल गए हों:
:w !sudo tee %
बात यह है कि मुझे यहां वह नहीं मिलता जो वास्तव में हो रहा है।
मैंने पहले ही यह समझ लिया है:
w
इसके लिए है
*:w_c* *:write_c*
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
(note the space in front of the '!'). {cmd} is
executed like with ":!{cmd}", any '!' is replaced with
the previous command |:!|.
इसलिए यह मानक इनपुट के रूप में सभी लाइनों को पास करता है।
!sudo tee
भाग कॉल tee
व्यवस्थापक विशेषाधिकारों के साथ।
सभी को समझ में आने के लिए, %
फ़ाइल नाम (एक पैरामीटर के लिए tee
) के रूप में आउटपुट करना चाहिए , लेकिन मुझे इस व्यवहार के लिए सहायता पर संदर्भ नहीं मिल सकते हैं।
tl; डॉ। कोई मेरी मदद कर सकता है इस आदेश को विच्छेदित करने में?
sudo
पर लागू किया जाता है cat
, लेकिन नहीं >
, इसलिए इसकी अनुमति नहीं है। आप एक sudo सबशेल में पूरे कमांड को चलाने की कोशिश कर सकते हैं, जैसे :w !sudo sh -c "cat % > yams.txt"
, लेकिन यह सब या तो काम नहीं करेगा, क्योंकि सबशेल में, %
nil है; आप अपनी फ़ाइल की सामग्री को खाली कर देंगे।
:w !sudo sh -c "cat >%"
वास्तव में सिर्फ sudo tee %
इसलिए काम करता है क्योंकि विम %
कभी फ़ाइल को सब्सक्राइब करने से पहले उसके लिए फ़ाइल नाम को प्रतिस्थापित करता है । हालांकि, उनमें से कोई भी काम नहीं करता है यदि फ़ाइलनाम में रिक्त स्थान है; आपको उसे ठीक करना है :w !sudo sh -c "cat >'%'"
या :w !sudo tee "%"
करना है।
:w !sudo cat > %
मानक आउटपुट को प्रदूषित करने के साथ-साथ काम नहीं करेगा ?