Viele von Ihnen haben wahrscheinlich den Befehl gesehen, mit dem Sie in eine Datei schreiben können, für die Root-Berechtigungen erforderlich sind, auch wenn Sie vergessen haben, vim mit sudo zu öffnen:
:w !sudo tee %
Die Sache ist, dass ich nicht verstehe, was genau hier passiert.
Ich habe mir das schon gedacht:
w
ist dafür
*: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 |:!|.
Daher werden alle Zeilen als Standardeingabe übergeben.
Der !sudo tee
Teil ruft tee
mit Administratorrechten auf.
Damit alle Sinn machen, %
sollte der Dateiname (als Parameter für tee
) ausgegeben werden , aber ich kann keine Referenzen in der Hilfe für dieses Verhalten finden.
tl; dr Könnte mir jemand helfen sezieren diesen Befehl?
sudo
wird auf angewendet cat
, aber nicht auf >
, daher ist dies nicht zulässig. Sie könnten versuchen, den gesamten Befehl in einer sudo-Subshell auszuführen, :w !sudo sh -c "cat % > yams.txt"
aber das funktioniert auch nicht, da in der Subshell %
null ist. Sie werden den Inhalt Ihrer Datei ausblenden.
:w !sudo sh -c "cat >%"
tatsächlich genauso gut, sudo tee %
weil Vim den Dateinamen ersetzt, %
bevor er jemals in die Subshell gelangt. Keiner von ihnen funktioniert jedoch, wenn der Dateiname Leerzeichen enthält. Sie müssen das tun :w !sudo sh -c "cat >'%'"
oder :w !sudo tee "%"
beheben.
:w !sudo cat > %
nicht so gut funktionieren und die Standardausgabe nicht verschmutzen?