`: w! sudo tee %` ทำงานอย่างไร


27

หากคุณเปิดไฟล์ที่คุณไม่ได้รับอนุญาตให้เขียนเป็นกลุ่มแล้วตัดสินใจว่าคุณจำเป็นต้องเปลี่ยนไฟล์คุณสามารถเขียนการเปลี่ยนแปลงของคุณได้โดยไม่ต้องออกจาก vim โดยที่:w !sudo tee %
ฉันไม่เข้าใจวิธีการทำงานนี้ คุณช่วยกรุณาตัดออกได้ไหม
ฉันเข้าใจ:wส่วนมันเขียนบัฟเฟอร์ปัจจุบันไปยังดิสก์โดยสมมติว่ามีชื่อไฟล์ที่เชื่อมโยงอยู่ใช่ไหม
ฉันยังเข้าใจ!ว่าsudo teeคำสั่งใดที่เรียกใช้งานและ%แสดงถึงเนื้อหาบัฟเฟอร์ปัจจุบันใช่ไหม
แต่ก็ยังไม่เข้าใจว่ามันใช้งานได้อย่างไร

คำตอบ:


30

โครงสร้าง:w !cmdหมายถึง "เขียนบัฟเฟอร์ปัจจุบันไปป์ไลน์ผ่านคำสั่ง" ดังนั้นคุณสามารถทำเช่น:w !catและมันจะท่อ buffer catผ่าน

ตอนนี้%เป็นชื่อไฟล์ที่เกี่ยวข้องกับบัฟเฟอร์

ดังนั้นท่อน้ำพระทัยเนื้อหาของบัฟเฟอร์ผ่าน:w !sudo tee % sudo tee FILENAMEสิ่งนี้จะเขียนเนื้อหาของบัฟเฟอร์ออกไปยังไฟล์อย่างมีประสิทธิภาพ


7

% แสดงถึงชื่อไฟล์บัฟเฟอร์ปัจจุบันไม่ใช่เนื้อหา

ดังนั้นวิธีการที่ท่อบัฟเฟอร์ปัจจุบัน:w !sudo tee %sudo tee [currentfilename]

tee กำลังถูกเรียกใช้ในฐานะรูทดังนั้นจึงมีสิทธิ์ในการเขียนเพื่อบันทึก stdin ไว้ในไฟล์

ดูเพิ่มเติมที่https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work


2

ไม่ถูกต้องนัก!

!commandวิ่งคำสั่งเป็นตัวกรองคำสั่งที่ได้รับข้อความจากทำบางสิ่งบางอย่างและส่งออกไปยังstdinstdout

โดยใช้wคุณผลักเนื้อหาไฟล์ของstdin เป็นการลงทะเบียนพิเศษในกลุ่มซึ่งถือชื่อไฟล์ปัจจุบันsudo tee %%

ดังนั้นคุณจะได้รับsudo tee FILENAMEซึ่งจะผลักtee stdin- เนื้อหาไฟล์ - เป็นไฟล์ปัจจุบัน


2
:!commandเป็นตัวกรอง (cf. :h !) ในขณะที่:w !commandไม่ได้เป็นเพียงแค่ดำเนินการcommandกับไฟล์ปัจจุบันเป็นstdin(cf. :h :w_c) หากต้องการปัญญา: :w !sed /./dไม่เปลี่ยนเนื้อหาของบัฟเฟอร์ปัจจุบัน แต่สูตรย่อมไม่ถูกต้องด้วยเหตุผลอื่นจะต้องมีการหลบหนีออก:% :exec 'w !sudo tee ' . shellescape(expand('%', 1))คำสั่งเดิมไม่สามารถใช้งานได้พูดชื่อไฟล์ด้วยช่องว่าง
Satō Katsura
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.