许多人可能已经看到了允许您在需要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有人可以帮我剖析此命令吗?
sudo
应用于cat
,但不适用于>
,因此不允许使用。您可以尝试在sudo子外壳程序(如)中运行整个命令:w !sudo sh -c "cat % > yams.txt"
,但这也不起作用,因为在子外壳程序中%
为nil;您将清空文件的内容。
:w !sudo sh -c "cat >%"
实际上工作得一样好,sudo tee %
因为Vim %
在到达子shell之前会用文件名代替。但是,如果文件名中包含空格,则它们都不起作用。您必须执行:w !sudo sh -c "cat >'%'"
或:w !sudo tee "%"
解决该问题。
:w !sudo cat > %
不能很好地工作,并且不会污染标准输出吗?