【发布时间】:2011-02-05 17:53:21
【问题描述】:
你们中的许多人可能已经看到允许您在需要 root 权限的文件上写入的命令,即使您忘记使用 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;dr 有人可以帮我剖析这个命令吗?
【问题讨论】:
-
@Nathan:
:w !sudo cat > %会不会工作得那么好,不会污染标准输出? -
@bjarkef - 不,这不起作用。在这种情况下,
sudo应用于cat,但不应用于>,因此不允许。您可以尝试在 sudo 子shell 中运行整个命令,例如:w !sudo sh -c "cat % > yams.txt",但这也不起作用,因为在子shell 中,%为零;您将清空文件的内容。 -
我只想补充一点,在输入该命令后,可能会出现一条警告消息。如果是这样,请按 L。然后,您将被要求按 Enter。这样做,您最终将保存文件。
-
@NathanLong @knittl:
:w !sudo sh -c "cat >%"实际上和sudo tee %一样有效,因为Vim 在到达子shell 之前将文件名替换为%。但是,如果文件名中有空格,它们都不起作用;你必须做:w !sudo sh -c "cat >'%'"或:w !sudo tee "%"来解决这个问题。 -
使用 :W 保存并重新加载文件: command W :execute ':silent w !sudo tee % > /dev/null' | :编辑!