许多人可能已经看到了允许您在需要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 > %不能很好地工作,并且不会污染标准输出吗?