Nhiều người trong số các bạn có thể đã thấy lệnh cho phép bạn viết trên một tệp cần có quyền root, ngay cả khi bạn quên mở vim bằng sudo:
:w !sudo tee %
Vấn đề là tôi không hiểu chính xác những gì đang xảy ra ở đây.
Tôi đã tìm ra điều này:
w
là cho điều này
*: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 |:!|.
vì vậy nó vượt qua tất cả các dòng như đầu vào tiêu chuẩn.
Phần !sudo tee
gọi tee
với đặc quyền quản trị viên.
Để tất cả có ý nghĩa, %
nên xuất tên tệp (làm tham số cho tee
), nhưng tôi không thể tìm thấy tài liệu tham khảo về trợ giúp cho hành vi này.
tl; dr ai đó có thể giúp tôi mổ xẻ lệnh này không?
sudo
được áp dụng cho cat
, nhưng không được >
, vì vậy nó không được phép. Bạn có thể thử chạy toàn bộ lệnh trong một lớp con sudo, như :w !sudo sh -c "cat % > yams.txt"
, nhưng điều đó cũng không hoạt động, bởi vì trong lớp con, %
là con số không; bạn sẽ bỏ trống nội dung của tập tin của bạn.
:w !sudo sh -c "cat >%"
thực sự hoạt động tốt như là sudo tee %
vì Vim thay thế tên tệp cho %
trước khi nó được chuyển sang subshell. Tuy nhiên, không ai trong số họ làm việc nếu tên tệp có khoảng trắng trong đó; bạn phải làm :w !sudo sh -c "cat >'%'"
hoặc :w !sudo tee "%"
để sửa nó.
:w !sudo cat > %
không hoạt động tốt, và không gây ô nhiễm đầu ra tiêu chuẩn?